You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在设备端查询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调用的成败信息,移除上述配置代码后也没有明显变化。请问:

  1. 能否在设备端查询Firebase App Check的状态?
  2. 能否在应用端开启测试性的“App Check必填”选项?

解决方案

一、设备端查询Firebase App Check状态

Android端

  1. 获取令牌及验证状态
    调用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验证失败、网络问题等
        }
    }
  1. 开启调试日志
    在AndroidManifest.xml中添加调试元数据,即可在Logcat中过滤FirebaseAppCheck标签查看详细调用日志:
<meta-data
    android:name="firebase.appcheck.debug"
    android:value="true" />

iOS端

  1. 获取令牌及验证状态
    通过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()
    // 输出令牌信息或有效期
}
  1. 开启调试日志
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:30:22