Weryfikacja cyfrowych danych logowania w aplikacjach na Androida może służyć do uwierzytelniania i autoryzowania tożsamości użytkownika (np. za pomocą dokumentu tożsamości wydanego przez organ państwowy) oraz właściwości dotyczących tego użytkownika (np. prawa jazdy, dyplomu, wieku lub adresu) lub w innych sytuacjach, w których konieczne jest wydanie i weryfikacja danych logowania w celu potwierdzenia autentyczności danej osoby.
Cyfrowe dokumenty to publiczny standard W3C, który określa, jak uzyskać dostęp do weryfikowalnych cyfrowych dokumentów użytkownika z cyfrowego portfela. Jest on implementowany w przypadku zastosowań internetowych za pomocą interfejsu API zarządzania dokumentami W3C. Na urządzeniach z Androidem do weryfikacji danych logowania cyfrowych służy interfejs API DigitalCredential
menedżera danych logowania.
Implementacja
Aby zweryfikować cyfrowe poświadczenia tożsamości w projekcie na Androida:
- Dodaj zależności do skryptu kompilacji aplikacji i inicjuj klasę
CredentialManager
. - Utwórz żądanie cyfrowych danych logowania i użyj go do zainicjowania obiektu
DigitalCredentialOption
, a następnie utwórz obiektGetCredentialRequest
. - Uruchom proces
getCredential
z utworzonym żądaniem, aby otrzymaćGetCredentialResponse
lub obsłużyć ewentualne wyjątki. Po pomyślnym pobraniu zweryfikuj odpowiedź.
Dodawanie zależności i inicjowanie
Dodaj do skryptu kompilacji Gradle te zależności:
dependencies {
implementation("androidx.credentials:credentials:1.5.0-beta01")
implementation("androidx.credentials:credentials-play-services-auth:1.5.0-beta01")
}
Następnie zainicjuj instancję klasy CredentialManager
.
val credentialManager = CredentialManager.create(context)
Tworzenie żądania danych logowania cyfrowych
Utwórz żądanie cyfrowych danych logowania i użyj go do zainicjowania DigitalCredentialOption
.
// The request in the JSON format to conform with
// the JSON-ified Digital Credentials API request definition.
val requestJson = generateRequestFromServer()
val digitalCredentialOption =
GetDigitalCredentialOption(requestJson = requestJson)
// Use the option from the previous step to build the `GetCredentialRequest`.
val getCredRequest = GetCredentialRequest(
listOf(digitalCredentialOption)
)
Pobieranie danych logowania
Uruchom proces getCredential
z utworzoną prośbą. Otrzymasz odpowiedź GetCredentialResponse
, jeśli żądanie się powiedzie, lub GetCredentialException
, jeśli się nie powiedzie.
Proces getCredential
powoduje wyświetlenie w systemie Androida odpowiednich okien dialogowych, aby przedstawić użytkownikowi dostępne opcje danych logowania i pobrać jego wybór. Następnie aplikacja do portfela, która zawiera wybraną opcję danych logowania, wyświetli interfejs użytkownika do wyrażenia zgody i wykona czynności potrzebne do wygenerowania odpowiedzi dotyczącej cyfrowych danych logowania.
coroutineScope.launch {
try {
val result = credentialManager.getCredential(
context = activityContext,
request = getCredRequest
)
verifyResult(result)
} catch (e : GetCredentialException) {
handleFailure(e)
}
}
// Handle the successfully returned credential.
fun verifyResult(result: GetCredentialResponse) {
val credential = result.credential
when (credential) {
is DigitalCredential -> {
val responseJson = credential.credentialJson
validateResponseOnServer(responseJson)
}
else -> {
// Catch any unrecognized credential type here.
Log.e(TAG, "Unexpected type of credential ${credential.type}")
}
}
}
// Handle failure.
fun handleFailure(e: GetCredentialException) {
when (e) {
is GetCredentialCancellationException -> {
// The user intentionally canceled the operation and chose not
// to share the credential.
}
is GetCredentialInterruptedException -> {
// Retry-able error. Consider retrying the call.
}
is NoCredentialException -> {
// No credential was available.
}
is CreateCredentialUnknownException -> {
// An unknown, usually unexpected, error has occurred. Check the
// message error for any additional debugging information.
}
is CreateCredentialCustomException -> {
// You have encountered a custom error thrown by the wallet.
// If you made the API call with a request object that's a
// subclass of CreateCustomCredentialRequest using a 3rd-party SDK,
// then you should check for any custom exception type constants
// within that SDK to match with e.type. Otherwise, drop or log the
// exception.
}
else -> Log.w(TAG, "Unexpected exception type ${e::class.java}")
}
}