Erstellen von Passkeys und Anmeldung durch einmaliges Tippen in biometrische Prompts einbinden

Unter Android 15 unterstützt der Anmeldedaten-Manager einmaliges Tippen auf Anmeldedaten beim Erstellen und Abrufen. In diesem Ablauf werden die Informationen zu den Anmeldedaten, die erstellt oder verwendet werden, direkt in der biometrischen Aufforderung angezeigt, zusammen mit einem Einstiegspunkt zu weiteren Optionen. 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 Authentifizierung in Anwendungen.
  • Bei der Anmeldung ist diese Funktion nur für Szenarien mit einem Konto aktiviert, auch wenn mehrere Anmeldedaten verfügbar sind (z. B. Passkey und Passwort) für dieses Konto.

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 Ihrem handleCreatePasskeyQuery() BiometricPromptData hinzu mit die Klasse CreateEntry:

val createEntry = CreateEntry(
  // Additional properties...
  biometricPromptData = BiometricPromptData(
    allowedAuthenticators = allowedAuthenticator
  )
)

Anbieter von Anmeldedaten sollten das Attribut allowedAuthenticator explizit festlegen in der Instanz BiometricPromptData. Wenn diese Eigenschaft nicht festgelegt ist, wird der Wert ist standardmäßig DEVICE_WEAK. Legen Sie die optionale Property cryptoObject fest, wenn dies für Ihren Anwendungsfall erforderlich ist.

Aktivieren Sie die Funktion „Einmaltippen“ für Passkeys bei der Anmeldung.

Ähnlich wie beim Erstellen eines Passkeys gelten die bestehenden Einstellungen für Umgang mit Nutzeranmeldungen. Verwenden Sie unter BeginGetPublicKeyCredentialOption populatePasskeyData(), um die relevanten Informationen Authentifizierungsanfrage:

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 automatisch die Standardeinstellung verwendet: BIOMETRIC_WEAK.

PublicKeyCredentialEntry(
  // other properties...

  biometricPromptData = BiometricPromptData(
    allowedAuthenticators = allowedAuthenticator
  )
)

Auswahl des Anmeldedateneintrags verarbeiten

Rufen Sie beim Auswählen 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 Sie beispielsweise Wähle für die Auswahl des Eintrags zur Erstellung eines Passkeys deinen Code so aus:

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 Ablaufs. 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. Die authenticationError enthält auch eine Fehlermeldung in Verbindung mit dem errorCode, das auf einer UI angezeigt werden kann.

Extrahieren Sie auf ähnliche Weise Metadaten während der retrieveProviderGetCredentialRequest. Prüfen Sie, ob Ihr biometrischer Ablauf 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...