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

Pour recevoir et stocker les identifiants des émetteurs, votre application de portefeuille 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 du titulaire, qui détaille les informations nécessaires pour provisionner un identifiant. L'application du titulaire 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 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 Credential Manager Holder, 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 une requête RegisterCreationOptionsRequest avec celle-ci.

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 fichier binaire WebAssembly (Wasm) du comparateur recevra l'ensemble creationOptions défini lors de l'enregistrement et l'offre d'identifiants envoyée par l'émetteur pour déterminer les entrées affichées dans l'UI du Gestionnaire d'identifiants. Pour obtenir un exemple de correspondance, consultez l'exemple Open Source d'application de portefeuille.

Gérer une demande d'émission

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

L'intent qui lance l'activité contient la requête 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 :

  • Application à l'origine de la requête. Vous pouvez le récupérer avec getCallingAppInfo.
  • Requête de l'application appelante. Vous pouvez la récupérer avec getCallingRequest, qui renvoie un CreateCredentialRequest. Si la demande 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 le 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)
}

Attestation des clés

Voici quelques points à noter concernant l'attestation de clé :

  • Lorsque vous générez une attestation de clé, vous pouvez utiliser BigInteger.toByteArray() pour convertir les éléments de clé en clé Web JSON, par exemple. Cette méthode peut parfois ajouter un octet de signe et entraîner une erreur de validation. Dans ce cas, supprimez ces octets avant d'envoyer l'attestation de clé à l'émetteur.
  • Nous vous recommandons d'utiliser android_key_attestation comme type de preuve de clé.

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 envoyer l'exception d'identifiant de la même manière :

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'application exemple.