Flutter集成Supabase登录遇限流及会话恢复问题求助
问题:Supabase 登录与会话持久化异常
1. 登录重复调用触发限流错误
登录代码:
final supabaseClient = SupabaseClient('supabaseUrl','supabaseKey'); final response = await supabaseClient.auth.signInWithPassword(email: 'example@gmail.com',password: 'password'); await Supabase.instance.client.auth.setSession(response.session!.refreshToken!);
点击登录按钮后,signInWithPassword被多次调用,触发异常:
AuthException(message: Rate limit exceeded, statusCode: 429)
同时导致refresh token失效。
2. 会话恢复失败
尝试用SharedPreferences存储会话:
preferences.setString('persistSessionString',supabase.auth.currentSession!.persistSessionString);
热重载后恢复会话时执行:
final persistSessionString =preferences.getString('persistSessionString',) ??'?'; final res = await supabase.auth.recoverSession(persistSessionString);
出现错误:
Invalid Refresh Token: Refresh Token Not Found...400
3. 当前配置
AndroidManifest 配置
<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- Accepts URIs that begin with YOUR_SCHEME://YOUR_HOST --> <data android:scheme="io.supabase.flutterdomain" android:host="login-callback" /> </intent-filter>
main函数初始化代码
await Supabase.initialize( url: 'I add it from Supabase dashboard', anonKey:'I add it from Supabase dashboard', authCallbackUrlHostname: 'login-callback', );
解决方案
修复登录按钮重复触发
添加登录状态锁,避免重复调用登录接口:
bool _isLoggingIn = false; Future<void> _handleLogin() async { if (_isLoggingIn) return; _isLoggingIn = true; try { // 直接使用全局初始化的Supabase客户端,无需重新创建 await Supabase.instance.client.auth.signInWithPassword( email: 'example@gmail.com', password: 'password', ); // 登录成功后跳转首页等逻辑 } on AuthException catch (e) { // 处理错误提示 } finally { _isLoggingIn = false; } }
移除手动setSession调用
signInWithPassword成功后,Supabase SDK会自动管理会话状态,手动调用setSession会覆盖有效会话的refresh token,导致其失效,直接删除该行代码即可。
利用SDK内置会话持久化
Supabase Flutter SDK已经内置了基于SharedPreferences的会话持久化,无需手动存储persistSessionString:
await Supabase.initialize( url: '你的Supabase URL', anonKey: '你的Anon Key', authCallbackUrlHostname: 'login-callback', // 可选:自定义会话存储的key,默认值为supabase_session persistSessionKey: 'custom_supabase_session', );
正确的会话恢复与启动流程
应用启动时,SDK会自动尝试恢复会话,直接检查currentSession即可判断用户是否已登录:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Supabase.initialize( url: '你的Supabase URL', anonKey: '你的Anon Key', authCallbackUrlHostname: 'login-callback', ); final session = Supabase.instance.client.auth.currentSession; runApp(MaterialApp( home: session != null ? const HomePage() : const LoginPage(), )); }
验证AndroidManifest配置
确保android:scheme与初始化逻辑中的回调URL匹配,当前配置io.supabase.flutterdomain://login-callback与authCallbackUrlHostname: 'login-callback'一致,无需修改。
内容的提问来源于stack exchange,提问作者Jaafar Melhem
相关产品推荐
相关产品推荐

