Per ricevere e archiviare le credenziali degli emittenti, l'app del titolare deve gestire
i flussi di emissione. In un flusso di emissione, il sito web o l'app dell'emittente invia un'offerta di credenziali all'app del titolare che descrive in dettaglio le informazioni necessarie per il provisioning di una credenziale. L'app titolare utilizza RegistryManager per registrarsi in Credential
Manager con i tipi di credenziali che intende gestire. Ciò consente all'app di essere
visualizzata e selezionata dall'utente durante una richiesta di emissione per ricevere la
credenziale.
Per saperne di più su come funzionano le credenziali con l'API Holder, leggi la sezione Concetti di base dell'API Holder.
Compatibilità con la versione di Android
L'API Holder è supportata su Android 6 (livello API 23) e versioni successive.
Implementazione
Per utilizzare l'API Credential Manager Holder, aggiungi le seguenti dipendenze allo script di build del modulo dell'app:
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") }
Crea RegistryManager
Crea un'istanza RegistryManager e registra una
richiesta RegisterCreationOptionsRequest.
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)
}
Il matcher è un file binario WebAssembly (Wasm) che riceverà il set creationOptions durante la registrazione e l'offerta di credenziali inviata dall'emittente per determinare le voci visualizzate nell'interfaccia utente di Gestore delle credenziali. Fai riferimento
all'app wallet open source per un esempio di matcher.
Gestire una richiesta di emissione
Successivamente, il wallet deve gestire la selezione di un'opzione di creazione delle credenziali
da parte dell'utente. Definisci un'attività che ascolti il
filtro per intent androidx.credentials.registry.provider.action.CREATE_CREDENTIAL,
come illustrato nel portafoglio di esempio.
L'intent che avvia l'attività contiene la richiesta di creazione e l'origine
della chiamata, che puoi estrarre con la
funzione PendingIntentHandler.retrieveProviderCreateCredentialRequest. L'API
restituisce un ProviderCreateCredentialRequest contenente tutte le informazioni
associate alla richiesta di creazione. Esistono due componenti chiave:
- L'app che ha effettuato la richiesta. Puoi recuperarlo con
getCallingAppInfo. - La richiesta dall'app di chiamata. Puoi recuperarla con
getCallingRequest, che restituisce unCreateCredentialRequest. Se la richiesta riguarda le credenziali digitali, è un'istanza diCreateDigitalCredentialRequest, che contiene il file JSON della richiesta di emissione nella proprietàrequestJson. Puoi elaborarlo con il seguente codice campione:
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)
}
Restituisci la risposta alla creazione
Una volta completati i passaggi necessari per salvare la credenziale nel wallet, termina l'attività con la risposta della credenziale:
val resultData = Intent()
PendingIntentHandler.setCreateCredentialResponse(
resultData,
CreateDigitalCredentialResponse(response.responseJson)
)
setResult(RESULT_OK, resultData)
finish()
Se esiste un'eccezione, puoi inviare in modo analogo l'eccezione delle credenziali:
val resultData = Intent()
PendingIntentHandler.setCreateCredentialException(
resultData,
CreateCredentialUnknownException() // Configure the proper exception
)
setResult(RESULT_OK, resultData)
finish()
Per visualizzare un esempio completo di restituzione della risposta delle credenziali nel contesto, consulta l'app di esempio.