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
相关产品推荐
相关产品推荐

