supabase_flutter 1.x移除setAuth后,Flutter如何使用自定义JWT?
在supabase_flutter 1.x中使用Firebase生成的自定义JWT认证
supabase_flutter 1.x版本移除了setAuth方法,替代方案有两种,都是官方支持的认证方式:
方法1:使用signInWithCustomToken(推荐)
这是官方推荐的自定义JWT登录方式,会自动处理Session的维护和刷新(如果有可用的refresh token)。
代码示例:
import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:firebase_auth/firebase_auth.dart'; Future<void> authenticateSupabaseWithFirebaseSms() async { // 先确保Firebase SMS认证已完成,拿到当前用户 final firebaseUser = FirebaseAuth.instance.currentUser; if (firebaseUser == null) { // 处理用户未通过Firebase认证的情况 return; } // 获取Firebase生成的idToken(即我们要用到的自定义JWT) final firebaseJwt = await firebaseUser.getIdToken(); try { // 调用Supabase的自定义token登录方法 await Supabase.instance.client.auth.signInWithCustomToken( token: firebaseJwt, ); print("Supabase认证成功,已使用Firebase JWT"); } catch (e) { print("Supabase认证失败: $e"); // 根据错误类型处理,比如token无效、权限不足等 } }
方法2:手动构建并设置Session
如果需要更精细的控制Session的内容(比如自定义用户元数据、过期时间),可以手动创建Session对象后调用setSession方法。
代码示例:
import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:firebase_auth/firebase_auth.dart'; Future<void> setSupabaseSessionManually() async { final firebaseUser = FirebaseAuth.instance.currentUser; if (firebaseUser == null) return; final firebaseJwt = await firebaseUser.getIdToken(); // 从Firebase token的payload中解析过期时间 final tokenPayload = await firebaseUser.getIdTokenResult(); final expiresAt = tokenPayload.expirationTime; // 构建Supabase Session对象 final session = Session( accessToken: firebaseJwt, refreshToken: null, // 如果Firebase提供refresh token可填入 expiresAt: expiresAt, user: User( id: firebaseUser.uid, email: firebaseUser.email, userMetadata: { 'phone': firebaseUser.phoneNumber, // 可以添加其他从Firebase获取的用户信息 }, appMetadata: {}, ), ); try { await Supabase.instance.client.auth.setSession(session); print("手动设置Supabase Session成功"); } catch (e) { print("设置Session失败: $e"); } }
关键注意事项
- 必须在Supabase控制台配置自定义JWT支持:进入Authentication > Settings > JWT Settings,确保允许外部JWT issuer(Firebase的issuer通常是
https://securetoken.google.com/[你的Firebase项目ID]),并验证JWT的签名密钥。 - 检查Firebase JWT的payload:确保
aud(受众)包含你的Supabase项目URL,或者在Supabase中配置允许该JWT的受众。 - 如果遇到认证错误,优先用JWT解析工具查看token的payload和签名是否符合Supabase的要求。
内容的提问来源于stack exchange,提问作者Sunil Gupta
相关产品推荐
相关产品推荐

