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