В Android 15 менеджер учетных данных поддерживает создание и получение учетных данных одним касанием. В этом процессе информация о создаваемых или используемых учетных данных отображается непосредственно в окне биометрической аутентификации, а также предоставляется доступ к дополнительным параметрам. Этот упрощенный процесс делает создание и получение учетных данных более эффективным и оптимизированным.
Требования:
- На устройстве пользователя настроена биометрическая аутентификация, и пользователь разрешает ей использовать систему аутентификации в приложениях.
- В сценариях входа в систему эта функция включена только для одной учетной записи, даже если для этой учетной записи доступно несколько учетных данных (например, ключ доступа и пароль).
Включить создание паролей одним касанием
Этапы создания, описанные в данном методе, соответствуют существующему процессу создания учетных данных . Внутри метода BeginCreatePublicKeyCredentialRequest используйте handleCreatePasskeyQuery() для обработки запроса, если он предназначен для ввода пароля.
is BeginCreatePublicKeyCredentialRequest -> {
Log.i(TAG, "Request is passkey type")
return handleCreatePasskeyQuery(request, passwordCount, passkeyCount)
}
В методе handleCreatePasskeyQuery() добавьте класс CreateEntry к классу BiometricPromptData :
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
)
)
Обработка выбора учетных данных
При обработке выбора учетных данных для создания пароля или выбора пароля во время входа в систему вызовите метод `retrieveProviderCreateCredentialRequest` или retrieveProviderGetCredentialRequest PendingIntentHandler's retrieveProviderCreateCredentialRequest , в зависимости от ситуации. Эти методы возвращают объекты, содержащие метаданные, необходимые для поставщика. Например, при обработке выбора данных для создания пароля обновите свой код следующим образом:
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.NO_SPACE , androidx.biometric.BiometricPrompt.UNABLE_TO_PROCESS , androidx.biometric.BiometricPrompt.ERROR_TIMEOUT и аналогичными. authenticationError также будет содержать сообщение об ошибке, связанное с errorCode , которое может отображаться в пользовательском интерфейсе.
Аналогичным образом извлекайте метаданные во время выполнения запроса retrieveProviderGetCredentialRequest . Проверьте, равен ли ваш биометрический поток null . Если да, настройте собственную биометрию для аутентификации. Это похоже на то, как инструментируется операция получения :
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...