Gérer l'émission d'identifiants avec votre application de détenteur

Pour recevoir et stocker les identifiants des émetteurs, votre application de détenteur doit gérer les flux d'émission. Dans un flux d'émission, le site Web ou l'application de l'émetteur envoie une offre d'identifiant à l'application de détenteur, en détaillant les informations nécessaires pour provisionner un identifiant. L'application de détenteur utilise RegistryManager pour enregistrer auprès du Gestionnaire d'identifiants les types d'identifiants qu'elle compte gérer. Cela permet à l'application d'être affichée et sélectionnée par l'utilisateur lors d'une demande d'émission pour recevoir l'identifiant.

Pour en savoir plus sur le fonctionnement des identifiants avec l'API Holder, consultez les concepts de base de l'API Holder.

Compatibilité avec les versions d'Android

L'API Holder est compatible avec Android 6 (niveau d'API 23) et versions ultérieures.

Implémentation

Pour utiliser l'API Holder du Gestionnaire d'identifiants, ajoutez les dépendances suivantes au script de compilation du module de votre application :

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

}

Créer le RegistryManager

Créez une instance RegistryManager et enregistrez-y une requête 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)
}

Le matcher est un fichier binaire WebAssembly (Wasm) qui reçoit les creationOptions définies lors de l'enregistrement et l'offre d'identifiant envoyée par l'émetteur pour déterminer les entrées affichées dans l'interface utilisateur du Gestionnaire d'identifiants. Pour obtenir un exemple de matcher, consultez l'exemple d'application de portefeuille Open Source wallet app.

Gérer une demande d'émission

Ensuite, le portefeuille doit gérer le moment où l'utilisateur sélectionne une option de création d'identifiant. Définissez une activité qui écoute le androidx.credentials.registry.provider.action.CREATE_CREDENTIAL filtre d'intent, comme illustré dans l'exemple de portefeuille.

L'intent qui lance l'activité contient la demande de création et l'origine de l'appel, que vous pouvez extraire avec la fonction PendingIntentHandler.retrieveProviderCreateCredentialRequest. L'API renvoie un ProviderCreateCredentialRequest contenant toutes les informations associées à la demande de création. Il se compose de deux éléments clés :

  • L'application qui a effectué la requête. Vous pouvez la récupérer avec getCallingAppInfo.
  • La requête de l'application appelante. Vous pouvez la récupérer avec getCallingRequest, qui renvoie un CreateCredentialRequest. Si la requête concerne des identifiants numériques, il s'agit d'une instance de CreateDigitalCredentialRequest, qui contient le JSON de la demande d'émission dans la propriété requestJson. Vous pouvez la traiter avec l'exemple de code suivant :
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)
}

Renvoyer la réponse de création

Une fois que le portefeuille a terminé les étapes nécessaires pour enregistrer l'identifiant, terminez l'activité avec la réponse de l'identifiant :

val resultData = Intent()
PendingIntentHandler.setCreateCredentialResponse(
    resultData,
    CreateDigitalCredentialResponse(response.responseJson)
)
setResult(RESULT_OK, resultData)
finish()

En cas d'exception, vous pouvez également envoyer l'exception d'identifiant :

val resultData = Intent()
PendingIntentHandler.setCreateCredentialException(
    resultData,
    CreateCredentialUnknownException() // Configure the proper exception
)
setResult(RESULT_OK, resultData)
finish()

Pour voir un exemple complet de renvoi de la réponse d'identifiant dans le contexte, consultez l' exemple d'application.