En Android 15, el Administrador de credenciales admite un flujo de toque único para credenciales. de creación y recuperación. En este flujo, la información de la credencial que se crea o se está utilizando, se muestra directamente en el mensaje biométrico, junto con con un punto de entrada a más opciones. Este proceso simplificado crea de creación y recuperación de credenciales eficaz y ágil.
Requisitos:
- Se configuraron datos biométricos en el dispositivo del usuario, y este los permite para la autenticación en aplicaciones.
- En el caso de los flujos de acceso, esta función solo está habilitada para situaciones de cuenta única, incluso si hay varias credenciales (como llave de acceso y contraseña) disponibles para esa cuenta.
Habilitar la función para presionar una vez en los flujos de creación de llaves de acceso
Los pasos de creación de este método coinciden con el proceso de creación de credenciales existente. Dentro de tu BeginCreatePublicKeyCredentialRequest
, usa handleCreatePasskeyQuery()
para procesar la solicitud si es para una llave de acceso.
is BeginCreatePublicKeyCredentialRequest -> {
Log.i(TAG, "Request is passkey type")
return handleCreatePasskeyQuery(request, passwordCount, passkeyCount)
}
En tu handleCreatePasskeyQuery()
, incluye BiometricPromptData
con
la clase CreateEntry
:
val createEntry = CreateEntry(
// Additional properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
)
)
Los proveedores de credenciales deben establecer la propiedad allowedAuthenticator
de forma explícita
en la instancia de BiometricPromptData
. Si no se establece esta propiedad, el valor
La configuración predeterminada es DEVICE_WEAK
. Configura la propiedad cryptoObject
opcional si es necesario
para tu caso de uso.
Habilita el acceso con un solo toque en los flujos de llaves de acceso de acceso
Al igual que el flujo de creación de llaves de acceso, seguirá la configuración existente para controlar el acceso de los usuarios. En BeginGetPublicKeyCredentialOption
, usa populatePasskeyData()
para recopilar la información relevante sobre la solicitud de autenticación:
is BeginGetPublicKeyCredentialOption -> {
// ... other logic
populatePasskeyData(
origin,
option,
responseBuilder,
autoSelectEnabled,
allowedAuthenticator
)
// ... other logic as needed
}
Al igual que CreateEntry
, una instancia BiometricPromptData
se establece en el
Instancia PublicKeyCredentialEntry
. Si no se establece de forma explícita, el valor predeterminado de allowedAuthenticator
es BIOMETRIC_WEAK
.
PublicKeyCredentialEntry(
// other properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
)
)
Controla la selección de la entrada de credencial
Mientras controlas la selección de la entrada de credenciales para la creación de una llave de acceso o
selección de la llave de acceso durante el acceso, llama a PendingIntentHandler's
retrieveProviderCreateCredentialRequest
, o
retrieveProviderGetCredentialRequest
, según corresponda. Estos muestran objetos que contienen los metadatos necesarios para el proveedor. Por ejemplo, cuando controles la selección de entradas para la creación de llaves de acceso, actualiza el código como se muestra a continuación:
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.authenitcationError
// Process the error
}
// Other logic...
}
Este ejemplo contiene información sobre el éxito del flujo biométrico. También
contiene más información sobre la credencial. Si el flujo falla, usa el
código de error en biometricPromptResult.authenticationError
para tomar decisiones.
Los códigos de error que se muestran como parte de
biometricPromptResult.authenticationError.errorCode
son los mismos códigos de error
definidos en la biblioteca androidx.biometric, como
androidx.biometric.BiometricPrompt.NO_SPACE:
androidx.biometric.BiometricPrompt.UNABLE_TO_PROCESS,
androidx.biometric.BiometricPrompt.ERROR_TIMEOUT y similar. El
authenticationError
también contendrá un mensaje de error asociado con el
errorCode
que se puede mostrar en una IU.
De manera similar, extrae metadatos durante retrieveProviderGetCredentialRequest
.
Comprueba si tu flujo biométrico es null
. Si es así, configura tus propios datos biométricos para autenticarte. Esto es similar a cómo se instrumenta la operación 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.authenitcationError
// Process the error
}
// Other logic...