Flutter FirebaseAuth token异常:CloudFirestore操作1小时后报GrantToken拦截错误
问题排查与解决步骤
报错信息:[FirestoreCallCredentials]: Failed to get token: com.google.firebase.FirebaseException: An internal error has occurred. [ Requests to this API securetoken.googleapis.com method google.identity.securetoken.v1.SecureToken.GrantToken are blocked. ]
1. 权限规则与账号状态排查
- 检查Firebase Authentication的用户会话配置,默认ID token有效期为1小时,确认是否启用了会话持久化异常限制,比如短周期强制重新登录、IP变动自动吊销token的规则
- 确认当前操作的账号没有被列入Firebase Authentication的禁用用户列表,也没有触发Google Cloud的身份防护规则(比如异常位置、异常请求频率被临时限流)
- 检查Cloud Firestore的安全规则,是否存在针对写操作的时间、频率限制逻辑,导致1小时节点触发权限拦截
2. API与网络访问限制排查
- 打开Google Cloud Console,进入
API和服务-凭据页面,检查项目中Flutter应用对应的OAuth 2.0客户端ID的应用限制配置:- 安卓端确认包名、SHA-1签名是否和实际打包的应用完全匹配
- iOS端确认包名、Team ID是否配置正确
- 没有额外添加对
securetoken.googleapis.com接口的调用限制
- 检查Google Cloud的
VPC服务控制配置,确认项目所属的服务边界没有把Secure Token API或者Cloud Firestore API列入禁止访问的服务列表 - 如果应用部署在国内网络环境,确认1小时周期节点的网络代理/防火墙没有临时拦截
securetoken.googleapis.com的请求,部分代理策略会对长周期运行的高频请求做临时拦截
3. Flutter端Firebase SDK配置排查
- 确认项目中使用的
firebase_core、cloud_firestore、firebase_auth依赖包版本处于官方推荐的稳定版本区间,避免旧版本SDK的token刷新逻辑bug - 检查是否在代码中手动修改了Firebase Auth的token刷新逻辑,错误的手动缓存token、拦截刷新请求会导致token过期后无法正常获取新token
- 可以临时添加异常捕获逻辑,触发报错时打印当前用户的token状态、网络请求的详细错误码,确认是本地调用错误还是云端返回的拦截错误:
try { await FirebaseFirestore.instance.doc("test/doc").update({"field": "value"}); } catch (e) { if (e is FirebaseException) { print("错误码: ${e.code}, 错误详情: ${e.message}"); print("当前用户是否登录: ${FirebaseAuth.instance.currentUser != null}"); if (FirebaseAuth.instance.currentUser != null) { final tokenResult = await FirebaseAuth.instance.currentUser!.getIdTokenResult(); print("token是否过期: ${tokenResult.expirationTime?.isBefore(DateTime.now()) ?? true}"); } } }
4. 临时验证方案
- 触发报错后,尝试手动调用
await FirebaseAuth.instance.currentUser?.getIdToken(true)强制刷新token,如果刷新成功后Firestore操作恢复正常,说明问题出在token自动刷新链路被拦截 - 更换不同的网络环境测试,如果更换网络后1小时后不再报错,说明是原有网络的防火墙/代理策略拦截了token刷新请求
内容的提问来源于stack exchange,提问作者Pation
相关产品推荐
相关产品推荐

