Flutter Firebase Auth/Firestore闲置后需重新登录才能正常工作
Flutter Firebase闲置后Auth/Firestore失效的解决方案
针对你遇到的「应用闲置30分钟后Firebase功能失效,需重新登录恢复」的问题,结合错误日志中的核心提示Requests to this API securetoken.googleapis.com method google.identity.securetoken.v1.SecureToken.GrantToken are blocked,可以按以下步骤排查解决:
1. 核查Firebase项目API权限
- 登录Firebase控制台,进入目标项目的「API库」(路径:项目设置 → 集成与API → API库)
- 搜索并确认「Secure Token Service API」「Google Identity Toolkit API」「Firebase Auth API」均处于启用状态
- 检查上述API的配额使用情况,确保未达到请求上限(闲置后触发失败可能与配额周期刷新有关)
2. 捕获令牌刷新异常并处理
Firebase Auth默认自动刷新令牌,但刷新失败时无默认处理逻辑,导致后续请求无有效凭证。可添加监听主动处理:
FirebaseAuth.instance.userChanges().listen((user) { if (user != null) { // 强制刷新令牌并捕获错误 user.getIdToken(true).catchError((error) { // 令牌刷新失败,清除会话并引导重新登录 FirebaseAuth.instance.signOut(); // 此处添加跳转到登录页的逻辑 }); } });
在Firestore操作前主动校验令牌有效性:
Future<void> _ensureValidAuthToken() async { final currentUser = FirebaseAuth.instance.currentUser; if (currentUser != null) { try { // 获取令牌结果,验证有效性 await currentUser.getIdTokenResult(); } catch (_) { // 验证失败,注销并跳转登录 await FirebaseAuth.instance.signOut(); // Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => LoginPage())); } } } // 调用示例 await _ensureValidAuthToken(); await FirebaseFirestore.instance.collection('your_collection').add({'data': 'value'});
3. 配置App Check消除警告
日志中提示No AppCheckProvider installed,虽然不是直接触发原因,但可能影响Auth令牌的验证链路。在Flutter中配置App Check:
- 添加依赖到
pubspec.yaml:
firebase_app_check: ^0.2.1+10
- 在应用初始化时激活:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); // 生产环境使用playIntegrity/appAttest,测试用debug await FirebaseAppCheck.instance.activate( androidProvider: AndroidProvider.playIntegrity, appleProvider: AppleProvider.appAttest, ); runApp(const MyApp()); }
注意:Android需在Play Console配置Play Integrity,iOS需配置App Attest,测试阶段可临时用AndroidProvider.debug。
4. 检查设备系统限制
- 确认设备未开启严格省电模式,允许应用在后台访问网络
- 检查应用的后台活动权限,确保Firebase相关服务能在闲置时正常运行
5. 更新Firebase依赖版本
日志中使用的Firebase Auth(22.3.1)和Firestore(24.11.0)版本较旧,可能存在已知的令牌刷新bug。更新到最新稳定版:
firebase_core: ^2.25.4 firebase_auth: ^4.17.8 cloud_firestore: ^4.15.7
内容的提问来源于stack exchange,提问作者Ahmed El Sayed
相关产品推荐
相关产品推荐

