In Android 15 unterstützt der Credential Manager einen Ablauf mit einem einzigen Tippen zum Erstellen und Abrufen von Anmeldedaten. In diesem Ablauf werden die Informationen der Anmeldedaten, die erstellt oder verwendet werden, direkt in der biometrischen Eingabeaufforderung angezeigt. Außerdem gibt es einen Einstiegspunkt für weitere Optionen. Dieser vereinfachte Prozess sorgt für eine effizientere und optimierte Erstellung und den Abruf von Anmeldedaten.
Voraussetzungen :
- Auf dem Gerät des Nutzers wurden biometrische Daten eingerichtet und der Nutzer erlaubt deren Verwendung für die Authentifizierung in Anwendungen.
- Bei Anmeldeabläufen ist diese Funktion nur für Szenarien mit einem einzelnen Konto aktiviert, auch wenn für dieses Konto mehrere Anmeldedaten (z. B. Passkey und Passwort) verfügbar sind.
Aktivieren Sie das Tippen auf Passkey-Erstellungsabläufe.
Die Erstellungsschritte dieser Methode entsprechen dem bestehenden Prozess zur Erstellung von Anmeldedaten. Verwenden Sie in Ihrer BeginCreatePublicKeyCredentialRequest die Funktion handleCreatePasskeyQuery(), um die Anfrage zu verarbeiten, wenn sie sich auf einen Passkey bezieht.
is BeginCreatePublicKeyCredentialRequest -> {
Log.i(TAG, "Request is passkey type")
return handleCreatePasskeyQuery(request, passwordCount, passkeyCount)
}
Fügen Sie in handleCreatePasskeyQuery() BiometricPromptData mit
der CreateEntry Klasse ein:
val createEntry = CreateEntry(
// Additional properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
),
)
Anmeldedatenanbieter sollten die Eigenschaft allowedAuthenticator in der BiometricPromptData-Instanz explizit festlegen. Wenn diese Eigenschaft nicht festgelegt ist, wird standardmäßig der Wert DEVICE_WEAK verwendet. Legen Sie bei Bedarf die optionale Eigenschaft cryptoObject fest.
Aktivieren Sie das Tippen auf Passkey-Anmeldeabläufe.
Ähnlich wie beim Passkey-Erstellungsablauf wird hier die bestehende Einrichtung für die Verarbeitung der Nutzeranmeldung verwendet.
Verwenden Sie unter BeginGetPublicKeyCredentialOption die Funktion 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 für allowedAuthenticator standardmäßig BIOMETRIC_WEAK verwendet.
PublicKeyCredentialEntry(
// other properties...
biometricPromptData = BiometricPromptData(
allowedAuthenticators = allowedAuthenticator
)
)
Auswahl von Anmeldedaten verarbeiten
Rufen Sie beim Verarbeiten der Auswahl von Anmeldedaten für die Passkey-Erstellung oder
Passkey-Auswahl während der Anmeldung je nach Bedarf die PendingIntentHandler's
retrieveProviderCreateCredentialRequest oder
retrieveProviderGetCredentialRequest auf. Diese geben Objekte zurück, die die für den Anbieter erforderlichen Metadaten enthalten. Wenn Sie beispielsweise die Auswahl von Anmeldedaten für die Passkey-Erstellung verarbeiten, aktualisieren Sie den Code wie unten gezeigt:
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...
}
Dieses Beispiel enthält Informationen zum Erfolg des biometrischen Ablaufs. Außerdem enthält es weitere Informationen zu den Anmeldedaten. Wenn der Ablauf fehlschlägt, verwenden Sie den Fehlercode unter biometricPromptResult.authenticationError, um Entscheidungen zu treffen.
Die Fehlercodes, die als Teil von
biometricPromptResult.authenticationError.errorCode zurückgegeben werden, sind dieselben Fehlercodes,
die in der androidx.biometric-Bibliothek definiert sind, z. B.
androidx.biometric.BiometricPrompt.ERROR_NO_SPACE,
androidx.biometric.BiometricPrompt.ERROR_UNABLE_TO_PROCESS,
androidx.biometric.BiometricPrompt.ERROR_TIMEOUT und ähnliche. authenticationError enthält auch eine Fehlermeldung, die mit dem errorCode verknüpft ist und auf einer Benutzeroberfläche angezeigt werden kann.
Extrahieren Sie Metadaten auch während der retrieveProviderGetCredentialRequest.
Prüfen Sie, ob Ihr biometrischer Ablauf null ist. Wenn ja, konfigurieren Sie Ihre eigene biometrische Authentifizierung. Das ähnelt der Instrumentierung der Get-Operation:
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...