Su Android 15, Gestore delle credenziali supporta un flusso con un solo tocco per la creazione e il recupero delle credenziali. In questo flusso, le informazioni della credenziale in fase di creazione o utilizzo vengono visualizzate direttamente nel prompt biometrico, insieme a un punto di accesso ad altre opzioni. Questa procedura semplificata crea un processo di creazione e recupero delle credenziali più efficiente e snello.
Requisiti:
- La biometria è stata configurata sul dispositivo dell'utente e l'utente la consente per l'autenticazione nelle applicazioni.
- Per i flussi di accesso, questa funzionalità è abilitata solo per scenari con un singolo account, anche se sono disponibili più credenziali (ad esempio passkey e password) per quell'account.
Attivare un solo tocco nei flussi di creazione delle passkey
I passaggi di creazione di questo metodo corrispondono alla procedura di creazione delle credenziali
esistenti. All'interno di BeginCreatePublicKeyCredentialRequest
, utilizza
handleCreatePasskeyQuery()
per elaborare la richiesta se riguarda una passkey.
is BeginCreatePublicKeyCredentialRequest -> {
Log.i(TAG, "Request is passkey type")
return handleCreatePasskeyQuery(request, passwordCount, passkeyCount)
}
Nel tuo handleCreatePasskeyQuery()
, includi BiometricPromptData
con la classe CreateEntry
:
val createEntry = CreateEntry(
// Additional properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
),
)
I fornitori di credenziali devono impostare esplicitamente la proprietà allowedAuthenticator
nell'istanza BiometricPromptData
. Se questa proprietà non è impostata, il valore
predefinito è DEVICE_WEAK
. Se necessario, imposta la proprietà facoltativa cryptoObject
per il tuo caso d'uso.
Attivare il singolo tocco nei flussi delle passkey di accesso
Analogamente al flusso di creazione delle passkey, questa operazione seguirà la configurazione esistente per
gestire l'accesso degli utenti. Nella sezione BeginGetPublicKeyCredentialOption
, utilizza
populatePasskeyData()
per raccogliere le informazioni pertinenti sulla
richiesta di autenticazione:
is BeginGetPublicKeyCredentialOption -> {
// ... other logic
populatePasskeyData(
origin,
option,
responseBuilder,
autoSelectEnabled,
allowedAuthenticator
)
// ... other logic as needed
}
Analogamente a CreateEntry
, un'istanza BiometricPromptData
è impostata sull'istanza
PublicKeyCredentialEntry
. Se non impostato esplicitamente,
allowedAuthenticator
è impostato su BIOMETRIC_WEAK
per impostazione predefinita.
PublicKeyCredentialEntry(
// other properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
)
)
Gestire la selezione dell'inserimento delle credenziali
Durante la gestione della selezione dell'inserimento delle credenziali per la creazione di passkey o la
selezione di passkey durante l'accesso, chiama PendingIntentHandler's
retrieveProviderCreateCredentialRequest
o
retrieveProviderGetCredentialRequest
, a seconda dei casi. Questi oggetti restituiscono
i metadati necessari per il fornitore. Ad esempio, quando gestisci
la selezione della voce di creazione della passkey, aggiorna il codice come mostrato di seguito:
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...
}
Questo esempio contiene informazioni sull'esito positivo del flusso biometrico. Contiene inoltre
altre informazioni sulla credenziale. Se il flusso non va a buon fine, utilizza il codice di errore
in biometricPromptResult.authenticationError
per prendere decisioni.
I codici di errore restituiti nell'ambito di
biometricPromptResult.authenticationError.errorCode
sono gli stessi codici di errore
definiti nella libreria androidx.biometric, ad esempio
androidx.biometric.BiometricPrompt.NO_SPACE,
androidx.biometric.BiometricPrompt.UNABLE_TO_PROCESS,
androidx.biometric.BiometricPrompt.ERROR_TIMEOUT e simili. Il
authenticationError
conterrà anche un messaggio di errore associato al
errorCode
che può essere visualizzato in un'interfaccia utente.
Analogamente, estrai i metadati durante retrieveProviderGetCredentialRequest
.
Controlla se il flusso biometrico è null
. In caso affermativo, configura i tuoi dati biometrici per
l'autenticazione. È simile al modo in cui viene strumentata l'operazione 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...