Flutter跨端App中Android端App Check随机出现无效请求问题
问题描述
使用Flutter、Firebase Firestore和Firebase Authentication开发的App,Android Play Store内部测试版每数小时会随机出现部分请求被标记为Unverified: invalid requests,其余请求验证正常;重启App后可恢复正常验证。而iOS TestFlight版本所有请求始终100%通过App Check验证。
现象细节
- Android单设备:初始存在未验证请求,后续数小时内验证正常,之后随机再次出现未验证请求,循环往复
- iOS单设备:所有请求始终处于已验证状态,无论经过数小时或数天
当前代码实现
Future<void> main() async{ WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform,); await FirebaseAppCheck.instance.activate( androidProvider: AndroidProvider.playIntegrity, appleProvider: AppleProvider.appAttestWithDeviceCheckFallback); runApp(AuthUserProviderWidget()); }
已完成的配置与尝试
- 已将Google Play Console中App Signing的SHA-256配置至Firebase App Check的Android Play Integrity设置中
- 尝试过的方案均未解决问题:
- 开启App Check强制验证、更换Android设备,问题依旧;使用Upload key的SHA256完全无法适配App Check
- 确认处于Release模式,升级Flutter至3.13.4、App Check至0.2.0及所有Firebase依赖
- 在Firebase初始化和App Check激活后添加延迟、多次激活App Check、开启token自动刷新
- 调用
getToken(true)并开启token自动刷新后,错误频率降低,但App从后台长时间回到前台时仍会出现验证失败
排查建议
主动处理App生命周期的令牌刷新
Play Integrity令牌有效期为1小时,Firebase App Check虽自动刷新,但Android后台唤醒时可能存在刷新不及时的情况。可以通过WidgetsBindingObserver监听AppLifecycleState.resumed状态,每次App回到前台时调用FirebaseAppCheck.instance.getToken(true)强制刷新令牌。排查网络状态变化的影响
当Android设备切换网络(WiFi/移动数据)或长时间断网后恢复,可能导致令牌刷新请求失败,后续请求使用过期令牌。可添加网络状态监听,在网络恢复时触发令牌刷新。验证Play Integrity配置完整性
确认Firebase控制台App Check的Android配置中,是否同时添加了App Signing密钥和Upload密钥的SHA-256(部分内部测试场景可能需要同时配置);检查App包名是否与Firebase控制台、Play Console完全一致。查看Firebase错误详情
前往Firebase控制台的App Check页面,查看未验证请求的具体错误原因(如令牌签名无效、包名不匹配、Play Integrity验证失败等),这些细节能直接定位问题根源。切换Provider对比测试
临时切换至AndroidProvider.debug或AndroidProvider.safetyNet(虽已弃用,但可用于对比),观察是否仍出现随机失败,判断是否为Play Integrity Provider的适配问题。检查令牌缓存逻辑
Firebase App Check会缓存令牌,可能存在缓存过期或更新不及时的问题。可尝试在App启动时强制刷新令牌,避免使用缓存中的旧令牌。
其他开发者反馈
目前有部分开发者在FlutterFire仓库反馈类似问题,集中在Play Integrity Provider下后台唤醒时令牌刷新不及时的场景,临时解决方案多为主动在App回到前台时强制刷新令牌。
内容的提问来源于stack exchange,提问作者Canada2000

