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

Flutter中Supabase Google OAuth登录后signOut()方法失效问题

解决Supabase Google OAuth退出后热重启仍登录的问题

核心原因

auth.signOut()默认会清除内存中的会话,但部分场景下本地持久化存储(如Flutter的SharedPreferences)里的会话缓存未被彻底清理,热重启时App会读取本地缓存自动恢复登录状态。

修复方案

1. 增强退出逻辑,确保会话彻底清除

扩展现有退出方法,增加会话校验与强制清除步骤,避免异常导致退出不完整:

Future signOutFromApi() async {
  try {
    await clientSupabase.auth.signOut();
    // 主动检查并清除残留会话
    if (clientSupabase.auth.currentSession != null) {
      await clientSupabase.auth.resetSession();
    }
  } catch (e) {
    throw Failure(e.toString());
  }
}

2. 手动清除本地存储的Supabase会话键

Supabase将会话数据存在特定本地键中,直接删除该键可彻底清除缓存:

import 'package:shared_preferences/shared_preferences.dart';

Future clearSupabaseLocalSession() async {
  final prefs = await SharedPreferences.getInstance();
  // 删除Supabase默认的会话存储键
  await prefs.remove('supabase.auth.token');
}

在signOutFromApi()执行完成后调用此方法,确保本地缓存无残留。

3. 启动时校验会话有效性

在App初始化阶段主动校验会话是否有效,若无效则强制登出:

Future validateSessionOnStartup() async {
  final session = clientSupabase.auth.currentSession;
  if (session != null) {
    try {
      // 通过调用任意需授权的接口校验会话
      await clientSupabase.from('users').select('id').limit(1);
    } catch (_) {
      // 会话无效,执行强制登出与缓存清理
      await clientSupabase.auth.signOut();
      await clearSupabaseLocalSession();
    }
  }
}

将此方法放在main()函数的初始化流程中执行。


内容的提问来源于stack exchange,提问作者Ivan Gustin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:37:11