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 unCreateCredentialRequest. Si la demande concerne des identifiants numériques, il s'agit d'une instance deCreateDigitalCredentialRequest, 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_attestationcomme 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.