带有 Firebase UI 的 Firebase 电话身份验证存在 SafetyNet 问题

Posted

技术标签:

【中文标题】带有 Firebase UI 的 Firebase 电话身份验证存在 SafetyNet 问题【英文标题】:Firebase Phone Auth with Firebase UI has SafetyNet issue 【发布时间】:2021-06-20 22:46:24 【问题描述】:

尝试在同一个 Firebase 项目中添加另一个应用程序,因为这两个应用程序相互关联,现在我们在一个 Firebase 项目中有两个应用程序具有不同的包名称但使用了相同的密钥库,因此版本 SHA1 和 SHA256 与好吧。

在 Cloud Console 中启用 android 设备验证,因此不再需要 CAPTCHA。

将应用程序包名称和 SHA1 添加到凭据中。

启动第二个新添加的应用,然后测试电话验证。

Firebase UI 收到未知错误。

日志:

2021-03-23 23:48:12.109 9350-9350/com.new.added.app E/g0: SafetyNet Attestation has advice: 
    LOCK_BOOTLOADER
2021-03-23 23:48:12.642 9350-10676/com.new.added.app E/FirebaseAuth: [GetAuthDomainTask] Error getting project config. Failed with INVALID_CERT_HASH 400
2021-03-23 23:48:12.745 9350-9350/com.new.added.app E/r0: Failed to get reCAPTCHA token with error [There was an error while trying to get your package certificate hash.]- calling backend without app verification
2021-03-23 23:48:13.179 9350-9453/com.new.added.app E/FirebaseAuth: [SmsRetrieverHelper] SMS verification code request failed: unknown status code: 17093 null
2021-03-23 23:48:13.192 9350-9350/com.new.added.app E/AuthUI: A sign-in error occurred.
    com.google.firebase.auth.p: This request is missing a valid app identifier, meaning that neither SafetyNet checks nor reCAPTCHA checks succeeded. Please try again, or check the logcat for more details.
        at c.c.a.d.f.h.tk.a(com.google.firebase:firebase-auth@@20.0.3:26)
        at c.c.a.d.f.h.yl.a(com.google.firebase:firebase-auth@@20.0.3:1)
        at c.c.a.d.f.h.zl.run(com.google.firebase:firebase-auth@@20.0.3:3)
        at android.os.Handler.handleCallback(Handler.java:794)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:176)
        at android.app.ActivityThread.main(ActivityThread.java:6651)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)

我注意到这发生在选定的设备上,我尝试运行发布 apk,它适用于 Xiaomi Redmi Note 2 SDK 21(无 SIM)和 Mi 90T Pro SDK 29(有 SIM),但 Redmi 5A 出现错误(没有 SIM 卡)。我认为这与启用Android Device Verification API 后SafetyNet 的工作方式有关,如果有人能解释一下,将非常感激和帮助。 TIA

更新:

我发现如果设备bootloaderunlocked,即使它没有root,Firebase Auth SafetyNet 也无法工作。

参考: https://forum.xda-developers.com/t/just-unlocking-the-bootloader-breakes-safety-net-and-make-device-unverified.4146761/ https://xiaomi.eu/community/threads/unlock-bootloader-and-banking-apps.56312/

由于大多数非高级用户可能不知道这一点,因此是否有任何解决方法?

【问题讨论】:

【参考方案1】:

如果您的设备引导加载程序处于解锁状态,那么您需要将其锁定。我也遇到了类似的问题,在解锁引导加载程序的情况下,我能够登录应用程序,但每次都可以看到 reCAPTCHA 并且项目 url 出现在 OTP 短信中。

根据 firebase,如果出现以下情况,设备将无法通过安全网检查:

    该应用未启用 Cloud Console 中的 Android 设备验证。

    用户没有 Google Play 服务支持或当您在模拟器上测试您的应用时。

    您的设备未通过可疑检查意味着您的设备是否已植根或设备引导加载程序处于 UNLOCKED 状态。

如果引导加载程序未锁定,即使您启用了 Android 设备验证,用户每次都会被重定向到 reCAPTCHA。

有关如何锁定引导加载程序的更多信息,请查看this

【讨论】:

但是在我的情况下,在 Cloud Console 中启用 Android 设备验证以删除 reCAPTCHA 后,Firebase OTP 开始失败并出现此错误。用户或设备所有者可能不知道他们不小心解锁了 OEM,因此这带来了另一个问题。 你能登录吗? 在使用验证码之前是的,然后我尝试通过启用 Android 设备验证然后放置所有包和 SHA1 来删除手机验证的验证码。之后,我开始收到 SafetyNet 和 Firebase UI 的错误,它只显示Unknown error occurred。我不记得解锁这个测试设备 OEM,也许我不小心启用但不确定。我刚开始注意到,当我重新启动或启动设备时,它会在屏幕下方显示“解锁”字样,当我在开发选项设置中检查它时,确认已启用 OEM 解锁。 Firebase 安全网只是给我们建议,如果 OEM 已解锁,这取决于开发人员是否要继续使用它。就像我的情况一样,我只是向用户展示这个建议,然后允许用户登录我的应用程序。如果安全网检查失败,请更新您阻止用户登录的代码。

以上是关于带有 Firebase UI 的 Firebase 电话身份验证存在 SafetyNet 问题的主要内容,如果未能解决你的问题,请参考以下文章

生成带有 minifyEnabled 设置为 true 的签名 APK 后,firebase UI 输出空白

使用 Firebase 从不同的集合中获取数据,并在数据更改时更新 UI

iOS 和 Android 上的 Firebase 邀请 - 是不是可以在不显示 UI 的情况下生成共享链接?

React:使用 firebase-ui 设置 firebase 身份验证

com.firebase.ui.auth.FirebaseUiException:提供程序错误 - Firebase-UI 身份验证 Facebook 登录不起作用

通过 Firebase UI 使用 Firebase 测试实验室电话身份验证