Damit Ihre Inhaber-App Anmeldedaten von Ausstellern empfangen und speichern kann, muss sie Ausstellungsabläufe verarbeiten. Bei einem Ausstellungsablauf sendet die Website oder App des Ausstellers ein Angebot für Anmeldedaten an die App des Inhabers. Darin werden die Informationen aufgeführt, die zum Bereitstellen von Anmeldedaten erforderlich sind. Die Inhaber-App verwendet RegistryManager, um die Anmeldedatentypen zu registrieren, die sie verarbeiten möchte. So kann die App dem Nutzer während einer Ausstellungsanfrage angezeigt und von ihm ausgewählt werden, um die Anmeldedaten zu erhalten.
Weitere Informationen zur Funktionsweise von Anmeldedaten mit der Holder API finden Sie unter Holder API – Kernkonzepte.
Kompatibilität mit Android-Versionen
Die Holder API wird ab Android 6 (API-Level 23) unterstützt.
Implementierung
Wenn Sie die Credential Manager Holder API verwenden möchten, fügen Sie dem Build-Skript Ihres App-Moduls die folgenden Abhängigkeiten hinzu:
Groovy
dependencies { // Use to implement credentials registrys implementation "androidx.credentials.registry:registry-digitalcredentials-mdoc:1.0.0-alpha04" implementation "androidx.credentials.registry:registry-digitalcredentials-openid:1.0.0-alpha04" implementation "androidx.credentials.registry:registry-digitalcredentials-sdjwtvc:1.0.0-alpha04" implementation "androidx.credentials.registry:registry-provider:1.0.0-alpha04" implementation "androidx.credentials.registry:registry-provider-play-services:1.0.0-alpha04" }
Kotlin
dependencies { // Use to implement credentials registrys implementation("androidx.credentials.registry:registry-digitalcredentials-mdoc:1.0.0-alpha04") implementation("androidx.credentials.registry:registry-digitalcredentials-openid:1.0.0-alpha04") implementation("androidx.credentials.registry:registry-digitalcredentials-sdjwtvc:1.0.0-alpha04") implementation("androidx.credentials.registry:registry-provider:1.0.0-alpha04") implementation("androidx.credentials.registry:registry-provider-play-services:1.0.0-alpha04") }
RegistryManager erstellen
Erstellen Sie eine RegistryManager-Instanz und registrieren Sie eine RegisterCreationOptionsRequest-Anfrage damit.
val registryManager = RegistryManager.create(context)
try {
registryManager.registerCreationOptions(object :
RegisterCreationOptionsRequest(
creationOptions = buildIssuanceData(),
matcher = loadIssuanceMatcher(),
type = DigitalCredential.TYPE_DIGITAL_CREDENTIAL,
id = "openid4vci",
) {}
)
} catch (e: Exception) {
Log.e(TAG, "Issuance registration failed.", e)
}
Der Abgleich ist eine WebAssembly-Binärdatei (Wasm), die die während der Registrierung festgelegte creationOptions und das vom Aussteller gesendete Angebot für Berechtigungsnachweise empfängt, um die in der Benutzeroberfläche des Credential Manager angezeigten Einträge zu bestimmen. Ein Beispiel für einen Matcher finden Sie in der Open-Source-Beispiel-Wallet-App.
Verarbeitet eine Ausstellungsanfrage.
Als Nächstes muss die Wallet darauf reagieren, wenn der Nutzer eine Option zum Erstellen von Anmeldedaten auswählt. Definieren Sie eine Aktivität, die auf den Intent-Filter androidx.credentials.registry.provider.action.CREATE_CREDENTIAL wartet, wie im Beispiel-Wallet gezeigt.
Der Intent, mit dem die Aktivität gestartet wird, enthält die Erstellungsanfrage und den Aufruforigin, die Sie mit der Funktion PendingIntentHandler.retrieveProviderCreateCredentialRequest extrahieren können. Die API gibt ein ProviderCreateCredentialRequest mit allen Informationen zur Erstellungsanfrage zurück. Es gibt zwei Hauptkomponenten:
- Die App, die die Anfrage gestellt hat. Sie können sie mit
getCallingAppInfoabrufen. - Die Anfrage der Anruf-App. Sie können sie mit
getCallingRequestabrufen, das einCreateCredentialRequestzurückgibt. Wenn es sich bei der Anfrage um digitale Anmeldedaten handelt, ist sie eine Instanz vonCreateDigitalCredentialRequest, die die JSON-Ausstellungsanfrage in der EigenschaftrequestJsonenthält. Sie können diese Daten mit dem folgenden Beispielcode verarbeiten:
val pendingIntentRequest =
PendingIntentHandler.retrieveProviderCreateCredentialRequest(intent)
val request = pendingIntentRequest!!.callingRequest
if (request is CreateDigitalCredentialRequest) {
Log.i(TAG, "Got DC creation request: ${request.requestJson}")
processCreationRequest(request.requestJson)
}
Schlüsselattestierung
Beachten Sie bei der Schlüsselbestätigung Folgendes:
- Beim Generieren einer Schlüsselbestätigung verwenden Sie möglicherweise
BigInteger.toByteArray(), um das Schlüsselmaterial in beispielsweise einen JSON-Webschlüssel zu konvertieren. Bei dieser Methode kann manchmal ein Vorzeichenbyte hinzugefügt werden, was zu einem Validierungsfehler führt. Entfernen Sie in diesem Fall diese Bytes, bevor Sie die Schlüsselbestätigung an den Aussteller senden. - Wir empfehlen,
android_key_attestationals Schlüsselbeweistyp zu verwenden.
Antwort auf die Erstellung zurückgeben
Sobald die Wallet die zum Speichern der Anmeldedaten erforderlichen Schritte abgeschlossen hat, beenden Sie die Aktivität mit der Anmeldedatenantwort:
val resultData = Intent()
PendingIntentHandler.setCreateCredentialResponse(
resultData,
CreateDigitalCredentialResponse(response.responseJson)
)
setResult(RESULT_OK, resultData)
finish()
Wenn es eine Ausnahme gibt, können Sie die Anmeldedaten-Ausnahme auf ähnliche Weise senden:
val resultData = Intent()
PendingIntentHandler.setCreateCredentialException(
resultData,
CreateCredentialUnknownException() // Configure the proper exception
)
setResult(RESULT_OK, resultData)
finish()
Ein vollständiges Beispiel für die Rückgabe der Anmeldedatenantwort im Kontext finden Sie in der Beispiel-App.