Weryfikowanie cyfrowych danych logowania

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:

  1. Dodaj zależności do skryptu kompilacji aplikacji i inicjuj klasę CredentialManager.
  2. Utwórz żądanie cyfrowych danych logowania i użyj go do zainicjowania obiektu DigitalCredentialOption, a następnie utwórz obiekt GetCredentialRequest.
  3. 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}")
    }
}