如何在设备端查询Firebase App Check状态及实现端侧测试校验?
问题描述
我在一款跨平台应用中集成了Firebase App Check:
- Android端采用Play Integrity:
Firebase.appCheck.installAppCheckProviderFactory( if (BuildConfig.DEBUG) { DebugAppCheckProviderFactory.getInstance() } else { PlayIntegrityAppCheckProviderFactory.getInstance() } )
- iOS端采用App Attest:
#if DEBUG let providerFactory = AppCheckDebugProviderFactory() AppCheck.setAppCheckProviderFactory(providerFactory) #else let providerFactory = SimpleAppCheckProviderFactory() AppCheck.setAppCheckProviderFactory(providerFactory) #endif FirebaseApp.configure()
class SimpleAppCheckProviderFactory: NSObject, AppCheckProviderFactory { func createProvider(with app: FirebaseApp) -> AppCheckProvider? { return AppAttestProvider(app: app) } }
目前Firebase App Check设置为「Monitor」模式,避免锁定现有用户。该实现上线生产环境后,发现大量请求被标记为“Unverified: invalid requests”。我希望在开启Enforcement模式前,确认这些请求是否来自自身应用。但排查日志时找不到App Check调用的成败信息,移除上述配置代码后也没有明显变化。请问:
- 能否在设备端查询Firebase App Check的状态?
- 能否在应用端开启测试性的“App Check必填”选项?
解决方案
一、设备端查询Firebase App Check状态
Android端
- 获取令牌及验证状态
调用getToken方法获取令牌结果,通过回调判断令牌有效性与获取结果:
Firebase.appCheck.getToken(false) // false表示不强制刷新现有令牌 .addOnCompleteListener { task -> if (task.isSuccessful) { val tokenResult = task.result val isTokenValid = tokenResult.expireTimeMillis > System.currentTimeMillis() // 可输出令牌内容(仅测试环境)、有效期等信息 } else { val error = task.exception // 捕获令牌获取失败原因,比如Play Integrity验证失败、网络问题等 } }
- 开启调试日志
在AndroidManifest.xml中添加调试元数据,即可在Logcat中过滤FirebaseAppCheck标签查看详细调用日志:
<meta-data android:name="firebase.appcheck.debug" android:value="true" />
iOS端
- 获取令牌及验证状态
通过token(completion:)方法获取令牌,在回调中处理结果:
AppCheck.appCheck().token { tokenResult, error in if let error = error { print("App Check令牌获取失败: \(error.localizedDescription)") return } guard let tokenResult = tokenResult else { return } let isTokenValid = tokenResult.expirationDate > Date() // 输出令牌信息或有效期 }
- 开启调试日志
在Info.plist中添加调试开关,或代码中设置日志级别,即可在Xcode控制台查看App Check详细日志:
<key>FirebaseAppCheckDebugEnabled</key> <true/>
或代码配置:
FirebaseConfiguration.shared.setLoggerLevel(.debug)
二、应用端开启测试性“App Check必填”
Firebase控制台的Enforcement是全局设置,可在应用代码中主动实现测试性验证逻辑,不影响全局用户:
Android端
发起Firebase服务请求前,先验证App Check令牌,仅当令牌有效时才继续请求:
Firebase.appCheck.getToken(false) .addOnSuccessListener { tokenResult -> // 令牌有效,执行后续Firebase请求(如Firestore、Storage调用) } .addOnFailureListener { e -> // 令牌验证失败,阻止请求并记录日志 Log.e("AppCheckTest", "令牌验证失败,取消请求: ${e.message}") }
iOS端
同样在请求前完成令牌验证:
AppCheck.appCheck().token { tokenResult, error in guard let tokenResult = tokenResult, error == nil else { print("令牌验证失败,取消Firebase请求") return } // 令牌有效,发起后续请求 }
额外说明
- 移除配置后无变化的原因:Monitor模式下Firebase仅标记未验证请求,不会拒绝请求,因此即使移除App Check配置,请求仍会被标记为Unverified,无明显差异。
- 日志无信息的原因:默认Firebase App Check日志级别较低,开启调试日志后即可查看令牌获取、验证的完整流程。
内容的提问来源于stack exchange,提问作者Tyler V
相关产品推荐
相关产品推荐

