Integruj tworzenie kluczy dostępu jednym kliknięciem i logowanie się za pomocą potwierdzeń biometrycznych

Na Androidzie 15 Menedżer danych logowania obsługuje tworzenie i pobieranie danych logowania jednym kliknięciem. W tym procesie informacje o tworzonych lub używanych danych logowania są wyświetlane bezpośrednio w wyświetleniu biometrycznym wraz z punktami wejścia do dodatkowych opcji. Ten uproszczony proces pozwala tworzyć i pobierać dane logowania w bardziej wydajny i wydajny sposób.

Wymagania:

  • na urządzeniu użytkownika została skonfigurowana biometria, a użytkownik zezwala na jej używanie do uwierzytelniania w aplikacjach;
  • W przypadku procesów logowania ta funkcja jest włączona tylko w przypadku pojedynczych kont, nawet jeśli są dostępne na nie różne dane logowania (np. klucz dostępu i hasło).

Włączanie tworzenia kluczy za pomocą jednego kliknięcia

Kroki tworzenia w ramach tej metody są zgodne z dotychczasowym procesem tworzenia danych logowania. W BeginCreatePublicKeyCredentialRequest użyj opcji handleCreatePasskeyQuery(), aby przetworzyć żądanie, jeśli dotyczy ono klucza dostępu.

is BeginCreatePublicKeyCredentialRequest -> {
  Log.i(TAG, "Request is passkey type")
  return handleCreatePasskeyQuery(request, passwordCount, passkeyCount)
}

W handleCreatePasskeyQuery() uwzględnij BiometricPromptData z klasą CreateEntry:

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

Dostawcy danych logowania powinni wyraźnie ustawić właściwość allowedAuthenticator w przypadku BiometricPromptData. Jeśli ta właściwość nie jest skonfigurowana, domyślna wartość to DEVICE_WEAK. W razie potrzeby ustaw opcjonalną właściwość cryptoObject.

Włączanie logowania za pomocą klucza dostępu za pomocą jednego kliknięcia

Podobnie jak w przypadku procesu tworzenia klucza dostępu, będzie to zgodne z dotychczasową konfiguracją obsługi logowania użytkownika. W sekcji BeginGetPublicKeyCredentialOption użyj pola populatePasskeyData(), aby zebrać odpowiednie informacje o prośbie o uwierzytelnienie:

is BeginGetPublicKeyCredentialOption -> {
  // ... other logic

  populatePasskeyData(
    origin,
    option,
    responseBuilder,
    autoSelectEnabled,
    allowedAuthenticator
  )

  // ... other logic as needed
}

Podobnie jak w przypadku CreateEntry instancja BiometricPromptData jest ustawiona na instancję PublicKeyCredentialEntry. Jeśli nie zostanie skonfigurowany, allowedAuthenticator domyślnie ma wartość BIOMETRIC_WEAK.

PublicKeyCredentialEntry(
  // other properties...

  biometricPromptData = BiometricPromptData(
    allowedAuthenticators = allowedAuthenticator
  )
)

Obsługa wyboru danych logowania

Podczas obsługi wyboru danych logowania na potrzeby tworzenia klucza dostępu lub wyboru klucza dostępu podczas logowania należy wywołać funkcję PendingIntentHandler's retrieveProviderCreateCredentialRequest lub retrieveProviderGetCredentialRequest. Zwracane obiekty zawierają metadane potrzebne dostawcy. Na przykład podczas obsługi wyboru wpisu w formularzu tworzenia klucza dostępu zaktualizuj kod w ten sposób:

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...
}

Ten przykład zawiera informacje o skuteczności procesu biometrycznego. Zawiera on też inne informacje o danych logowania. Jeśli przepływ nie powiedzie się, do podjęcia decyzji użyj kodu błędu w sekcji biometricPromptResult.authenticationError. Kody błędów zwracane w ramach biometricPromptResult.authenticationError.errorCode to te same kody błędów zdefiniowane w bibliotece androidx.biometric, takie jak androidx.biometric.BiometricPrompt.NO_SPACE, androidx.biometric.BiometricPrompt.UNABLE_TO_PROCESS, androidx.biometric.BiometricPrompt.ERROR_TIMEOUT i inne. authenticationError będzie też zawierać komunikat o błędzie związany z errorCode, który może być wyświetlany w interfejsie.

Podobnie wyodrębnij metadane podczas retrieveProviderGetCredentialRequest. Sprawdź, czy proces biometryczny jest null. Jeśli tak, skonfiguruj własne dane biometryczne do uwierzytelniania. Jest to podobne do tego, jak jest instrumentowana operacja 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...