You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter集成Supabase后端遇JWT过期异常(PGRST301)求助

问题解决:Supabase Flutter应用JWT过期报错(PGRST301)

问题原因

你遇到的PGRST301错误是因为Supabase匿名密钥生成的JWT令牌过期了。即使是匿名用户,Supabase也会签发有有效期的JWT(默认1小时),前3次调用时令牌仍在有效期内,后续过期就触发了未授权错误。

解决方案

1. 确保SDK自动处理会话刷新

Supabase Flutter SDK默认会自动刷新过期会话,可显式配置初始化参数确保功能生效:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Supabase.initialize(
    url: AppConsts.supaBaseURL,
    anonKey: AppConsts.anonKey,
    persistSession: true, // 强制开启会话持久化,保障自动刷新逻辑
    debug: true, // 开启调试日志,方便排查刷新异常
  );
}

2. 调用API前手动检查并刷新会话

若自动刷新失效(如应用后台驻留过久),可在数据请求前主动校验会话状态,过期则手动刷新:

Future<List<BrandModel>> getBrands() async {
  List<BrandModel> data = [];
  try {
    final session = supabase.auth.currentSession;
    // 检查会话是否存在且已过期
    if (session != null && session.isExpired) {
      await supabase.auth.refreshSession();
    }
    var response = await supabase.from('brand').select();
    data = (response as List).map((e) => BrandModel.fromJson(e)).toList();
  } catch (e) {
    print(e);
    // 刷新失败时,尝试重新匿名登录
    if (e is PostgrestException && e.code == 'PGRST301') {
      await supabase.auth.signInAnonymously();
      // 重新发起数据请求
      var response = await supabase.from('brand').select();
      data = (response as List).map((e) => BrandModel.fromJson(e)).toList();
    }
  }
  return data;
}

3. 调整Supabase控制台的JWT过期时间

若频繁触发过期,可登录Supabase控制台,进入Settings -> API,修改JWT expiration time(默认3600秒),延长匿名用户令牌有效期。注意平衡安全性与体验,不建议设置过长。

内容的提问来源于stack exchange,提问作者Eddy Hezarian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:33:26