【问题标题】:What is the correct flow to check for biometrics and pin/password with BiometricPrompt?使用 BiometricPrompt 检查生物特征和密码/密码的正确流程是什么?
【发布时间】:2020-04-22 21:32:05
【问题描述】:

BiometricManager 有一个 canAuthenticate 方法可以返回 4 个标志之一:

when (biometricManager.canAuthenticate()) {
    BiometricManager.BIOMETRIC_SUCCESS ->
        Log.d("MY_APP_TAG", "App can authenticate using biometrics.")
    BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE ->
        Log.e("MY_APP_TAG", "No biometric features available on this device.")
    BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE ->
        Log.e("MY_APP_TAG", "Biometric features are currently unavailable.")
    BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED ->
        Log.e("MY_APP_TAG", "The user hasn't associated " +
        "any biometric credentials with their account.")
}

现在,如果该调用的结果是 BIOMETRIC_SUCCESS,则仅触发 BiometricPrompt 似乎是合乎逻辑的,否则回退到不同的身份验证方法(即应用专用密码)。

但如果我在 BiometricPrompt 上设置了setDeviceCredentialAllowed(true),即使canAuthenticate 检查没有返回BIOMETRIC_SUCCESS,它仍然可以使用设备密码(我认为在这种情况下它会返回@ 987654329@)。

我还可以使用KeyguardManager 来检查是否设置了密码/密码/模式:

val kgm = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
if (kgm.isDeviceSecure) {
    [...]
}

但这仅适用于 API 23+。但是,setDeviceCredentialAllowed 适用于低于 23 的 API 级别。但似乎没有真正的替代方法可以检查这些旧设备上是否设置了设备密码

所以我的问题是:对于所有这些不同的选项,向用户展示适当的身份验证方法的正确流程是什么? canAuthenticateisDeviceSecure应该如何搭配使用,API级别低于23应该使用什么检查?

【问题讨论】:

    标签: fingerprint biometrics android-fingerprint-api android-biometric-prompt android-biometric


    【解决方案1】:

    仅当您尝试仅使用生物识别进行身份验证时才应使用canAuthenticate(),而不是其他任何东西。在这种情况下,是well documented recommended approach

    如果您的兴趣是 setDeviceCredentialAllowed(true),而该功能本身仅适用于 API 21+,您有几个实现选项,具体取决于您的 minSdkVersion。

    API 23+

     if (keyguardManager.isDeviceSecure()){
         biometricPrompt.authenticate(promptInfo)
     }
    

    API 16 到 API 23 之前的版本

    if (keyguardManager.isKeyguardSecure) {
       biometricPrompt.authenticate(promptInfo)
    }
    

    KeyguardManager.isKeyguardSecure() 等同于 isDeviceSecure(),除非设备已锁定 SIM 卡。

    API 14 到 API 16 之前的版本

    如果您的目标低于 API 16 或 SIM 锁定是一个问题,那么回调 onAuthenticationError() 是您的最佳选择。

    【讨论】:

    • 感谢您的回答。但是,我有一些疑问:1)You should use canAuthenticate() only when you are trying to authenticate exclusively with biometrics, not with anything else 为什么会这样?我的意思是,我可以同时使用生物识别和设备凭据作为后备。 2)如果 sim 卡已锁定但未设置 pin/pattern/password,使用isKeyguardSecure 锁定的 sim 卡是否会导致误报检查? 3) 为什么要检查 API 级别低于 21?据我所知,setDeviceCredentialAllowed 不会低于API 21
    • 1) 我回答了一个类似的问题stackoverflow.com/questions/59566044/…。 3) 如果您的应用的 minSdkVersion 低于 21,这一切都取决于您希望如何实现代码。
    • 另一个问题也是我的。我假设您的意思是我们应该使用CryptoObject,而这与setDeviceCredentialAllowed 不兼容。但是如果我们使用BiometricPrompt 而不使用CryptoObject 呢?
    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 2016-09-19
    • 2015-02-13
    • 2023-03-17
    • 2015-12-28
    • 1970-01-01
    • 2013-11-07
    • 2017-07-24
    相关资源
    最近更新 更多