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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:43:11