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

W Androidzie 15 Menedżer danych logowania obsługuje tworzenie i pobieranie danych logowania w ramach jednego procesu. 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:

  • 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łączanie tworzenia kluczy za pomocą jednego kliknięcia

Kroki tworzenia tej metody są zgodne z tworzeniem istniejących 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 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, aby dopasować ją do potrzeb danego 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 skonfigurowana inaczej, allowedAuthenticator ma domyślną 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. Te zwracające obiekty które zawierają metadane niezbędne 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. Dodatkowo zawiera inne informacje dotyczące danych logowania. Jeśli przepływ nie powiedzie się, użyj metody kodu błędu w ramach zasady 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ó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łasne dane biometryczne do uwierzytelniania. 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...