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
相关产品推荐
相关产品推荐

