BiometricPrompt: Почему мы должны проверять KeyguardManager.isDeviceSecure () перед включением setDeviceCredentialAllowed?

В документации метода BiometricPrompt.PromptInfo setDeviceCredentialAllowed говорится:

[...] Разработчики должны сначала проверить KeyguardManager.isDeviceSecure (), прежде чем включать это. Если устройство небезопасно, BiometricPrompt.ERROR_NO_DEVICE_CREDENTIAL будет возвращен в BiometricPrompt.AuthenticationCallback.onAuthenticationError (int, CharSequence).

https://developer.android.com/reference/androidx/biometric/BiometricPrompt.PromptInfo.Builder.html#setDeviceCredentialAllowed(boolean)

Однако для включения биометрической аутентификации в первую очередь необходимо установить PIN-код устройства или пароль. Разве эта проверка (которая доступна только в API 23+) не является излишней, когда у нас уже есть BiometricManager.canAuthenticate?


person Florian Walther    schedule 02.01.2020    source источник


Ответы (1)


Это большой вопрос! Может быть важно дать пошаговый ответ. Во-первых, давайте отделим то, что происходит на конкретном устройстве, от того, что происходит в вашем приложении. Затем мы обратимся к более конкретному вопросу.

Устройство

Устройство, на котором работает API 23+, может иметь или не иметь настройки учетных данных для входа в систему. Владелец устройства не обязан устанавливать PIN-код устройства, графический ключ, пароль или биометрические шаблоны. Это выбор.

Приложение

Пользователь должен иметь возможность установить ваше приложение независимо от того, были ли настроены учетные данные устройства. Поэтому ваше приложение должно быть написано таким образом, чтобы обрабатывать случаи использования, когда учетные данные для входа не были настроены.

Ответьте на ваш более конкретный вопрос

Рекомендуется сдавать от CryptoObject до authenticate(), когда внедрение биометрического API. Если вы последуете этой рекомендации, то да, вы проверите canAuthenticate(), прежде чем звонить authenticate(promptInfo, cryptoObject). Для этого есть ряд причин, о которых вы можете узнать, прочитав указанное выше сообщение в блоге.

Поскольку ваш вопрос касается конкретно setDeviceCredentialAllowed(true), важно вспомнить, что делает canAuthenticate(). Он проверяет три вещи: есть ли на устройстве биометрическое оборудование, есть ли у пользователя зарегистрированные шаблоны или активировал ли пользователь биометрическую аутентификацию.

Следовательно, вы не можете использовать canAuthenticate() в вашем случае, так как он касается исключительно биометрии, тогда как setDeviceCredentialAllowed(true) принимает PIN-код устройства, шаблон или пароль.

Обратите внимание: хотя рекомендуется использовать CryptoObject, setDeviceCredentialAllowed() несовместимо ни с CryptoObject, ни с setNegativeButtonText().

P.S. Вам также может быть полезно прочитать этот блог опубликовать.

person Isai Damier    schedule 02.01.2020
comment
Спасибо! Так это проверка на случай, если у кого-то не зарегистрированы биометрические данные, но установлен пароль устройства? И как можно выполнить такую ​​же проверку ниже API 23? Потому что с .setDeviceCredentialAllowed(true) BiometricPrompt все еще может вернуться к паролю устройства там. Так что было бы неплохо проверить, установлен ли там пароль. - person Florian Walther; 03.01.2020
comment
Вы пишете Следовательно, вы не можете использовать canAuthenticate () в вашем случае, поскольку это исключительно о биометрии. Но биометрия не может быть включена без установки пин-кода / пароля / шаблона, верно? Так что я все еще не понимаю смысла этой проверки. Если на устройстве есть биометрические данные, у него также есть учетные данные устройства. - person Florian Walther; 04.01.2020
comment
Пусть B представляет биометрию. Пусть P представляет ПИН / шаблон / пароль. Тогда ваше утверждение о том, что из B следует P, верно. Другими словами, если биометрия включена, можно с уверенностью предположить, что PIN / пароль / шаблон также включены. НО Обратное неверно. Тот факт, что PIN-код / ​​шаблон / пароль включен, не обязательно означает, что биометрические данные включены; в конце концов, PIN / пароль были в обращении раньше, чем биометрия. В документе говорится, что вам нужно убедиться, что на устройстве установлены PIN-код / ​​шаблон / пароль, прежде чем пытаться использовать их для входа в систему. Ничего общего с биометрией как таковой. - person Isai Damier; 07.01.2020
comment
вы должны представить себе ситуацию, когда на устройстве нет биометрических данных, но для него установлен PIN / шаблон / пароль. - person Isai Damier; 07.01.2020
comment
В этом есть смысл. Теперь единственная проблема в том, что KeyguardManager.isDeviceSecure доступен только на уровне API 23+. А как насчет устройств на 21+, которые также поддерживают PIN-код / ​​шаблон / пароль? - person Florian Walther; 07.01.2020
comment
Функциональные возможности библиотеки биометрии работают только с API 23. Зависимость Gradle будет компилироваться на устройствах с API 14+, но функции / методы поддерживаются только на 23+. - person Isai Damier; 07.01.2020
comment
В зависимости от уровня minSdkVersion, на который нацелено ваше приложение, вам, возможно, придется отказаться от удобной предварительной проверки и самостоятельно обработать коды ошибок в onAuthenticationError(errorCode: Int, errString: CharSequence). - person Isai Damier; 07.01.2020
comment
Значит, на AP 21-23 нет соответствующей проверки пин-кода / шаблона / пароля? А что насчет KeyguardManager.isKeyguardSecure? - person Florian Walther; 07.01.2020
comment
Технически вы можете использовать keyguardManager.isKeyguardSecure вплоть до API 16, если блокировка SIM-карты для вас не проблема. - person Isai Damier; 07.01.2020
comment
Спасибо, я пытаюсь понять, будет ли это проблемой. Теоретически сим может быть заблокирован, но мое приложение может работать, верно? Насколько я понимаю, это может вызвать ложное срабатывание при проверке PIN-кода / шаблона / пароля (даже если это маловероятно) - person Florian Walther; 07.01.2020