В Android 15 Менеджер учетных данных поддерживает создание и получение учетных данных одним нажатием. В этом случае информация о создаваемых или используемых учетных данных показывается прямо в окне биометрической аутентификации, где также есть ссылка на дополнительные параметры. Этот упрощенный процесс делает создание и получение учетных данных более эффективным и оптимизированным.
Требования
- На устройстве пользователя настроена биометрическая аутентификация, и пользователь разрешил ее для входа в приложения.
- Для входа эта функция включена только в сценариях с одним аккаунтом, даже если для него доступно несколько учетных данных (например, ключ доступа и пароль).
Включить создание ключей доступа одним нажатием
Шаги по созданию этого метода совпадают с существующим процессом создания учетных данных. В BeginCreatePublicKeyCredentialRequest используйте handleCreatePasskeyQuery(), чтобы обработать запрос, если он предназначен для ключа доступа.
is BeginCreatePublicKeyCredentialRequest -> {
Log.i(TAG, "Request is passkey type")
return handleCreatePasskeyQuery(request, passwordCount, passkeyCount)
}
Включите в handleCreatePasskeyQuery() элемент BiometricPromptData с классом CreateEntry:
val createEntry = CreateEntry(
// Additional properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
),
)
Поставщики учетных данных должны явно задать свойство allowedAuthenticator в экземпляре BiometricPromptData. Если это свойство не задано, по умолчанию используется значение DEVICE_WEAK. При необходимости задайте необязательное свойство cryptoObject.
Включить вход с помощью ключа доступа одним нажатием
Как и в случае с созданием ключа доступа, это будет соответствовать существующей настройке для обработки входа пользователя. В разделе BeginGetPublicKeyCredentialOption используйте populatePasskeyData(), чтобы собрать информацию о запросе на аутентификацию:
is BeginGetPublicKeyCredentialOption -> {
// ... other logic
populatePasskeyData(
origin,
option,
responseBuilder,
autoSelectEnabled,
allowedAuthenticator
)
// ... other logic as needed
}
Как и в случае с CreateEntry, экземпляр BiometricPromptData задается для экземпляра PublicKeyCredentialEntry. Если значение не задано, allowedAuthenticator по умолчанию равно BIOMETRIC_WEAK.
PublicKeyCredentialEntry(
// other properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
)
)
Обработка выбора учетных данных
При обработке выбора записи учетных данных для создания ключа доступа или выбора ключа доступа во время входа вызовите PendingIntentHandler's
retrieveProviderCreateCredentialRequest или retrieveProviderGetCredentialRequest соответственно. Они возвращают объекты,
содержащие метаданные, необходимые для поставщика. Например, при обработке выбора записи для создания ключа доступа обновите код, как показано ниже:
val createRequest = PendingIntentHandler.retrieveProviderCreateCredentialRequest(intent)
if (createRequest == null) {
Log.i(TAG, "request is null")
setUpFailureResponseAndFinish("Unable to extract request from intent")
return
}
// Other logic...
val biometricPromptResult = createRequest.biometricPromptResult
// Add your logic based on what needs to be done
// after getting biometrics
if (createRequest.callingRequest is CreatePublicKeyCredentialRequest) {
val publicKeyRequest: CreatePublicKeyCredentialRequest =
createRequest.callingRequest as CreatePublicKeyCredentialRequest
if (biometricPromptResult == null) {
// Do your own authentication flow, if needed
} else if (biometricPromptResult.isSuccessful) {
createPasskey(
publicKeyRequest.requestJson,
createRequest.callingAppInfo,
publicKeyRequest.clientDataHash,
accountId
)
} else {
val error = biometricPromptResult.authenticationError
// Process the error
}
// Other logic...
}
Этот пример содержит информацию об успешном выполнении биометрической аутентификации. Он также содержит другую информацию об учетных данных. Если процесс завершится неудачно, используйте код ошибки в biometricPromptResult.authenticationError, чтобы принять решение.
Коды ошибок, возвращаемые в составе biometricPromptResult.authenticationError.errorCode, совпадают с кодами ошибок, определенными в библиотеке androidx.biometric, например androidx.biometric.BiometricPrompt.ERROR_NO_SPACE, androidx.biometric.BiometricPrompt.ERROR_UNABLE_TO_PROCESS, androidx.biometric.BiometricPrompt.ERROR_TIMEOUT и т. д. Объект authenticationError также будет содержать сообщение об ошибке, связанное с объектом errorCode, которое можно показать в интерфейсе.
Аналогичным образом извлеките метаданные во время retrieveProviderGetCredentialRequest.
Проверьте, соответствует ли ваш процесс биометрической аутентификации null. Если да, настройте собственные биометрические данные для аутентификации. Это похоже на то, как инструментируется операция get:
val getRequest =
PendingIntentHandler.retrieveProviderGetCredentialRequest(intent)
if (getRequest == null) {
Log.i(TAG, "request is null")
setUpFailureResponseAndFinish("Unable to extract request from intent")
return
}
// Other logic...
val biometricPromptResult = getRequest.biometricPromptResult
// Add your logic based on what needs to be done
// after getting biometrics
if (biometricPromptResult == null) {
// Do your own authentication flow, if necessary
} else if (biometricPromptResult.isSuccessful) {
Log.i(TAG, "The response from the biometricPromptResult was ${biometricPromptResult.authenticationResult?.authenticationType}")
validatePasskey(
publicKeyRequest.requestJson,
origin,
packageName,
uid,
passkey.username,
credId,
privateKey
)
} else {
val error = biometricPromptResult.authenticationError
// Process the error
}
// Other logic...