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

Na Androidzie 15 Menedżer danych logowania obsługuje proces logowania się jednym dotknięciem w przypadku danych logowania. ich tworzenie i pobieranie. W ramach tego procesu informacje o danych logowania utworzonych lub używanych, są wyświetlane bezpośrednio w prompcie biometrycznym, który daje dostęp do większej liczby opcji. Ten uproszczony proces pozwala zwiększyć efektywny i uproszczony proces tworzenia i pobierania danych logowania.

Wymagania:

  • Dane biometryczne zostały skonfigurowane na urządzeniu użytkownika, a użytkownik zezwala na do uwierzytelniania aplikacji.
  • 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łącz procesy tworzenia kluczy dostępu jednym kliknięciem

Kroki tworzenia w ramach tej metody są zgodne z dotychczasowym procesem tworzenia danych logowania. W aplikacji BeginCreatePublicKeyCredentialRequest użyj 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 zajęcia CreateEntry:

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

Dostawcy danych uwierzytelniających powinni jawnie ustawić właściwość allowedAuthenticator w instancji BiometricPromptData. Jeśli ta właściwość nie jest ustawiona, wartość domyślna wartość to DEVICE_WEAK. W razie potrzeby ustaw opcjonalną właściwość cryptoObject. do swojego przypadku użycia.

Włącz przepływy kluczy dostępu do logowania jednokrotnego

Podobnie jak w przypadku procesu tworzenia klucza dostępu, proces ten będzie przebiegał zgodnie z dotychczasową konfiguracją obsługi logowania użytkowników. W sekcji BeginGetPublicKeyCredentialOption użyj populatePasskeyData(), aby zebrać odpowiednie informacje o żądanie uwierzytelnienia:

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 wybierania wpisów danych logowania na potrzeby tworzenia klucza dostępu lub wybór klucza dostępu podczas logowania, wywołaj PendingIntentHandler's retrieveProviderCreateCredentialRequest lub retrieveProviderGetCredentialRequest. Te zwracające obiekty które zawierają metadane niezbędne dostawcy. Na przykład podczas obsługi wybór wpisu dotyczącego tworzenia klucza dostępu, zaktualizuj kod w sposób pokazany poniżej:

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. Dodatkowo zawiera inne informacje dotyczące danych logowania. Jeśli przetwarzanie nie powiedzie się, użyj kodu błędu w sekcji biometricPromptResult.authenticationError, aby podjąć decyzję. Kody błędów zwrócone w ramach biometricPromptResult.authenticationError.errorCode to te same kody błędów zdefiniowane w bibliotece androidx.biometric, na przykład androidx.biometric.BiometricPrompt.NO_SPACE, androidx.biometric.BiometricPrompt.UNABLE_TO_PROCESS, androidx.biometric.BiometricPrompt.ERROR_TIMEOUT itp. authenticationError będzie też zawierać komunikat o błędzie związany z errorCode, które można wyświetlać w interfejsie.

Podobnie wyodrębniaj metadane w czasie retrieveProviderGetCredentialRequest. Sprawdź, czy proces biometryczny jest ustawiony na null. Jeśli tak, skonfiguruj własną biometrię, aby uwierzytelnienie. Jest to podobne do instrumentacji operacji pobierania:

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