Unter Android 15 unterstützt der Anmeldedaten-Manager einen Ablauf mit nur einem Tippen zum Erstellen und Abrufen von Anmeldedaten. In diesem Ablauf werden die Informationen zu den Anmeldedaten, die erstellt oder verwendet werden, direkt im biometrischen Prompt zusammen mit einem Einstiegspunkt zu weiteren Optionen angezeigt. Dieser vereinfachte Prozess ermöglicht eine effizientere und optimierte Erstellung und Abruf von Anmeldedaten.
Anforderungen:
- Auf dem Gerät des Nutzers wurde ein biometrisches Verfahren eingerichtet und der Nutzer erlaubt die Verwendung für die Authentifizierung in Anwendungen.
- Bei der Anmeldung ist diese Funktion nur für Szenarien mit einem einzelnen Konto aktiviert, auch wenn mehrere Anmeldedaten (z. B. Passkey und Passwort) für dieses Konto verfügbar sind.
Abläufe zum Erstellen von Passkeys durch einmaliges Tippen aktivieren
Die Erstellungsschritte dieser Methode entsprechen dem vorhandenen Prozess zum Erstellen von Anmeldedaten. Verwenden Sie in BeginCreatePublicKeyCredentialRequest
handleCreatePasskeyQuery()
, um die Anfrage zu verarbeiten, wenn es sich um einen Passkey handelt.
is BeginCreatePublicKeyCredentialRequest -> {
Log.i(TAG, "Request is passkey type")
return handleCreatePasskeyQuery(request, passwordCount, passkeyCount)
}
Fügen Sie in Ihrer handleCreatePasskeyQuery()
-Datei BiometricPromptData
mit der Klasse CreateEntry
ein:
val createEntry = CreateEntry(
// Additional properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
)
)
Anbieter von Anmeldedaten sollten das Attribut allowedAuthenticator
in der Instanz BiometricPromptData
explizit festlegen. Wenn dieses Attribut nicht festgelegt ist, wird der Wert standardmäßig auf DEVICE_WEAK
gesetzt. Legen Sie die optionale Property cryptoObject
fest, falls dies für Ihren Anwendungsfall erforderlich ist.
Aktivieren Sie die Funktion „Einmaltippen“ für Passkeys bei der Anmeldung.
Ähnlich wie beim Erstellen von Passkeys wird dabei die vorhandene Einrichtung für die Anmeldung von Nutzern verwendet. Verwende unter BeginGetPublicKeyCredentialOption
die populatePasskeyData()
, um die relevanten Informationen zur Authentifizierungsanfrage zu erfassen:
is BeginGetPublicKeyCredentialOption -> {
// ... other logic
populatePasskeyData(
origin,
option,
responseBuilder,
autoSelectEnabled,
allowedAuthenticator
)
// ... other logic as needed
}
Ähnlich wie bei CreateEntry
wird eine BiometricPromptData
-Instanz auf die PublicKeyCredentialEntry
-Instanz festgelegt. Wenn nicht explizit festgelegt, wird allowedAuthenticator
standardmäßig auf BIOMETRIC_WEAK
gesetzt.
PublicKeyCredentialEntry(
// other properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
)
)
Auswahl von Anmeldedateneinträgen verarbeiten
Rufen Sie bei der Auswahl des Anmeldedateneintrags für die Erstellung eines Passkeys oder die Auswahl eines Passkeys bei der Anmeldung PendingIntentHandler's
retrieveProviderCreateCredentialRequest
oder retrieveProviderGetCredentialRequest
auf. Diese Rückgabeobjekte enthalten die für den Anbieter erforderlichen Metadaten. Wenn du beispielsweise die Auswahl eines Eintrags zur Passkey-Erstellung abwickelst, aktualisiere deinen Code so:
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...
}
Dieses Beispiel enthält Informationen zum Erfolg des biometrischen Flusses. Außerdem enthält er weitere Informationen zu den Anmeldedaten. Wenn der Ablauf fehlschlägt, verwenden Sie den Fehlercode unter biometricPromptResult.authenticationError
, um Entscheidungen zu treffen.
Die Fehlercodes, die im Rahmen von biometricPromptResult.authenticationError.errorCode
zurückgegeben werden, sind dieselben Fehlercodes, die in der androidx.biometric-Bibliothek definiert sind, z. B. androidx.biometric.BiometricPrompt.NO_SPACE, androidx.biometric.BiometricPrompt.UNABLE_TO_PROCESS, androidx.biometric.BiometricPrompt.ERROR_TIMEOUT und ähnliche. Der authenticationError
enthält außerdem eine Fehlermeldung, die mit dem errorCode
verknüpft ist und auf einer Benutzeroberfläche angezeigt werden kann.
Extrahieren Sie auch während der retrieveProviderGetCredentialRequest
Metadaten.
Prüfe, ob dein biometrischer Blutfluss null
ist. Falls ja, konfigurieren Sie Ihre eigenen biometrischen Daten für die Authentifizierung. Das entspricht der Instrumentierung des Abrufvorgangs:
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...