Firebase App Check仅单设备可用 其余设备解码Token失败问题求助
问题根因及排查解决步骤
依赖版本兼容问题
你当前使用的firebase-appcheck-safetynet:16.0.0-beta02属于早期测试版本,存在已知的App Check Token生成截断、无效值返回的兼容bug,仅部分系统版本/设备的SafetyNet调用逻辑可以适配。一加8T刚好符合适配条件,其余设备生成的Token不完整,就会触发云函数侧的JWT解码失败错误。
解决方案:
升级Firebase BOM到最新稳定版,同时将App Check provider替换为已正式替代SafetyNet的Play Integrity提供商(或至少升级到appcheck-safetynet的正式稳定版),示例依赖配置如下:implementation platform('com.google.firebase:firebase-bom:32.7.0') implementation 'com.google.firebase:firebase-appcheck-playintegrity' implementation 'com.google.firebase:firebase-analytics-ktx' implementation 'com.google.firebase:firebase-messaging' implementation 'com.google.firebase:firebase-crashlytics-ktx' implementation 'com.google.firebase:firebase-functions-ktx' implementation 'com.google.firebase:firebase-config-ktx'对应初始化代码调整为:
private fun initFirebaseAppCheck() { FirebaseApp.initializeApp(this) FirebaseAppCheck.getInstance().installAppCheckProviderFactory( PlayIntegrityAppCheckProviderFactory.getInstance() ) }Google Play服务版本不达标
App Check的SafetyNet/Play Integrity校验要求设备的Google Play服务版本不低于21.0.0,校验失败的设备大概率Play服务版本过低,无法正常生成有效Token。可在测试设备的设置-应用-Google Play服务中查看版本号,升级到最新版即可验证。签名配置问题
如果你开启了Google Play应用签名,需要将Google Play控制台中「应用完整性」页面的SHA-256签名指纹,填写到Firebase控制台App Check的Play Integrity/SafetyNet配置中,仅填写本地打包的keystore指纹会导致只有你本地直接打包安装的设备(比如一加8T)可以通过校验,从Play商店下载的安装包签名和本地不一致,无法生成有效Token。调试白名单配置问题
如果你之前在Firebase App Check控制台添加过一加8T的调试Token作为白名单设备,其余测试设备未添加的情况下,早期beta版SDK在未通过正式校验时会返回无效占位Token,而不是抛出明确的校验失败错误,也会触发解码失败问题。初始化时机问题
确保initFirebaseAppCheck方法在Application的onCreate生命周期最前端执行,不要做延迟初始化,避免App还未拿到有效App Check Token时就触发云函数调用,此时SDK传递的Token为空或不完整,也会触发解码失败。
内容的提问来源于stack exchange,提问作者Mehul Kanzariya

