Gestire l'emissione delle credenziali con l'app del titolare

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 un CreateCredentialRequest. Se la richiesta riguarda le credenziali digitali, è un'istanza di CreateDigitalCredentialRequest, 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.