Supabase应用运行后出现Invalid JWT问题,求auth.headers刷新方案
问题描述
在main.dart中初始化Supabase的代码如下:
await Supabase.initialize( url: config.api.url, anonKey: config.api.anonKey, );
调用Edge Function的代码如下:
final authHeader = Supabase.instance.client.auth.headers['Authorization'] ?? ''; SseClient( http.Request( 'POST', Uri.parse('${getConfigFromEnv().api.url}/functions/v1/chat_stream'), ) ..headers.addAll({ 'Authorization': authHeader, 'Content-Type': 'application/json', }) ..body = jsonEncode(data), httpClientProvider: http.Client.new, ); }
初始运行正常,但应用长时间打开后,JWT过期,再次触发Edge Function时收到“Invalid JWT”响应,需要确保auth.headers中的JWT能自动刷新。
解决方案
1. 替换直接读取auth.headers的方式,从当前会话获取有效Token
Supabase.instance.client.auth.headers中的内容不会实时更新会话刷新后的新Token,正确做法是从当前会话对象中获取最新的AccessToken:
final session = Supabase.instance.client.auth.currentSession; final authHeader = session != null ? 'Bearer ${session.accessToken}' : '';
Supabase客户端会自动处理会话的刷新逻辑,currentSession始终返回最新的有效会话(包括刷新后的新Token)。
2. 确认自动刷新与会话持久化配置(默认已开启,可显式声明)
初始化Supabase时,默认已启用自动刷新Token和会话持久化,若需要显式确认配置,可添加以下参数:
await Supabase.initialize( url: config.api.url, anonKey: config.api.anonKey, autoRefreshToken: true, // 显式开启自动刷新(默认值为true) persistSession: true, // 持久化会话,重启应用后可恢复并自动刷新(默认值为true) );
3. 监听会话状态变化(可选,用于实时更新依赖Token的逻辑)
如果需要在Token刷新时实时更新相关业务逻辑,可以监听Auth状态变化事件:
Supabase.instance.client.auth.onAuthStateChange.listen((authState) { final Session? newSession = authState.session; // 会话更新(如Token刷新)时,在此处更新需要使用Token的模块 });
4. 主动检查会话有效性并触发刷新(极端场景处理)
若担心会话已过期但未触发自动刷新,可在调用Edge Function前主动检查并刷新:
try { final currentSession = Supabase.instance.client.auth.currentSession; if (currentSession != null && currentSession.isExpired) { // 主动刷新会话 await Supabase.instance.client.auth.refreshSession(); } // 获取最新Token final authHeader = 'Bearer ${Supabase.instance.client.auth.currentSession?.accessToken ?? ''}'; // 执行Edge Function调用逻辑 } catch (e) { // 处理刷新失败情况,如引导用户重新登录 }
内容的提问来源于stack exchange,提问作者progNewbie
相关产品推荐
相关产品推荐

