Digitale Anmeldedaten bestätigen

Die Überprüfung digitaler Anmeldedaten in Android-Apps kann verwendet werden, um die Identität eines Nutzers (z. B. über einen amtlichen Ausweis), Eigenschaften dieses Nutzers (z. B. einen Führerschein, einen akademischen Abschluss oder Attribute wie Alter oder Adresse) zu authentifizieren und zu autorisieren oder in anderen Fällen, in denen Anmeldedaten ausgestellt und überprüft werden müssen, um die Echtheit einer Entität zu bestätigen.

Digitale Anmeldedaten sind ein öffentlicher W3C-Inkubatorstandard, der festlegt, wie über ein digitales Wallet auf die überprüfbaren digitalen Anmeldedaten eines Nutzers zugegriffen werden kann. Er wird für Webanwendungsfälle mit der W3C Credential Management API implementiert. Unter Android wird die DigitalCredential API des Anmeldedaten-Managers zum Verifizieren digitaler Anmeldedaten verwendet.

Implementierung

So bestätigen Sie digitale Anmeldedaten in Ihrem Android-Projekt:

  1. Fügen Sie dem Build-Script Ihrer App Abhängigkeiten hinzu und initialisieren Sie eine CredentialManager-Klasse.
  2. Erstelle eine Anfrage für digitale Anmeldedaten und initialisiere damit eine DigitalCredentialOption. Erstelle dann die GetCredentialRequest.
  3. Starte den getCredential-Vorgang mit der erstellten Anfrage, um eine erfolgreiche GetCredentialResponse-Antwort zu erhalten, oder handel bei auftretenden Ausnahmen entsprechend. Bestätige nach dem Abrufen die Antwort.

Abhängigkeiten hinzufügen und initialisieren

Fügen Sie Ihrem Gradle-Build-Script die folgenden Abhängigkeiten hinzu:

dependencies {
    implementation("androidx.credentials:credentials:1.5.0-beta01")
    implementation("androidx.credentials:credentials-play-services-auth:1.5.0-beta01")
}

Initialisieren Sie als Nächstes eine Instanz der Klasse CredentialManager.

val credentialManager = CredentialManager.create(context)

Anfrage für digitale Anmeldedaten erstellen

Erstellen Sie eine Anfrage für digitale Anmeldedaten und verwenden Sie sie, um eine DigitalCredentialOption zu initialisieren.

// 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)
)

Anmeldedaten abrufen

Starte den getCredential-Vorgang mit der erstellten Anfrage. Sie erhalten entweder eine erfolgreiche GetCredentialResponse oder eine GetCredentialException, wenn die Anfrage fehlschlägt.

Der getCredential-Vorgang löst Android-Systemdialogfelder aus, in denen die verfügbaren Anmeldedatenoptionen des Nutzers angezeigt und seine Auswahl erfasst werden. Als Nächstes werden in der Wallet-App, die die ausgewählte Anmeldedatenoption enthält, Benutzeroberflächen angezeigt, um die Einwilligung einzuholen und die erforderlichen Aktionen auszuführen, um eine Antwort mit digitalen Anmeldedaten zu generieren.

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}")
    }
}