Valider des identifiants numériques

La validation des identifiants numériques dans les applications Android peut être utilisée pour authentifier et autoriser l'identité d'un utilisateur (comme une pièce d'identité officielle), les propriétés de cet utilisateur (comme un permis de conduire, un diplôme universitaire ou des attributs tels que l'âge ou l'adresse), ou d'autres scénarios où un identifiant doit être émis et validé pour affirmer l'authenticité d'une entité.

Les identifiants numériques sont une norme publique de l'incubateur W3C qui spécifie comment accéder aux identifiants numériques vérifiables d'un utilisateur à partir d'un portefeuille numérique. Ils sont implémentés pour les cas d'utilisation Web avec l'API de gestion des identifiants W3C. Sur Android, l'API DigitalCredential du Gestionnaire d'identifiants est utilisée pour valider les identifiants numériques.

Implémentation

Pour valider les identifiants numériques dans votre projet Android, procédez comme suit:

  1. Ajoutez des dépendances au script de compilation de votre application et initialisez une classe CredentialManager.
  2. Créez une requête d'identifiants numériques et utilisez-la pour initialiser un DigitalCredentialOption, puis créez le GetCredentialRequest.
  3. Lancez le flux getCredential avec la requête créée pour recevoir une GetCredentialResponse réussie ou gérer les exceptions pouvant se produire. Une fois la récupération effectuée, validez la réponse.

Ajouter des dépendances et initialiser

Ajoutez les dépendances suivantes à votre script de compilation Gradle:

dependencies {
    implementation("androidx.credentials:credentials:1.5.0-beta01")
    implementation("androidx.credentials:credentials-play-services-auth:1.5.0-beta01")
}

Ensuite, initialisez une instance de la classe CredentialManager.

val credentialManager = CredentialManager.create(context)

Créer une requête d'identifiants numériques

Créez une requête d'identifiants numériques et utilisez-la pour initialiser un DigitalCredentialOption.

// The request in the JSON format to conform with
// the JSON-ified Digital Credentials API request definition.
val requestJson = generateRequestFromServer()
val digitalCredentialOption =
    GetDigitalCredentialOption(requestJson = requestJson)

// Use the option from the previous step to build the `GetCredentialRequest`.
val getCredRequest = GetCredentialRequest(
    listOf(digitalCredentialOption)
)

Obtenir l'identifiant

Lancez le flux getCredential avec la requête créée. Vous recevrez un GetCredentialResponse réussi ou un GetCredentialException si la requête échoue.

Le flux getCredential déclenche des boîtes de dialogue du système Android pour présenter les options d'identifiants disponibles de l'utilisateur et collecter sa sélection. Ensuite, l'application portefeuille contenant l'option d'identifiant choisie affiche des UI pour collecter le consentement et effectuer les actions nécessaires à la génération d'une réponse d'identifiant numérique.

coroutineScope.launch {
    try {
        val result = credentialManager.getCredential(
            context = activityContext,
            request = getCredRequest
        )
        verifyResult(result)
    } catch (e : GetCredentialException) {
        handleFailure(e)
    }
}

// Handle the successfully returned credential.
fun verifyResult(result: GetCredentialResponse) {
    val credential = result.credential
    when (credential) {
        is DigitalCredential -> {
            val responseJson = credential.credentialJson
            validateResponseOnServer(responseJson)
        }
        else -> {
            // Catch any unrecognized credential type here.
            Log.e(TAG, "Unexpected type of credential ${credential.type}")
        }
    }
}

// Handle failure.
fun handleFailure(e: GetCredentialException) {
  when (e) {
        is GetCredentialCancellationException -> {
            // The user intentionally canceled the operation and chose not
            // to share the credential.
        }
        is GetCredentialInterruptedException -> {
            // Retry-able error. Consider retrying the call.
        }
        is NoCredentialException -> {
            // No credential was available.
        }
        is CreateCredentialUnknownException -> {
            // An unknown, usually unexpected, error has occurred. Check the
            // message error for any additional debugging information.
        }
        is CreateCredentialCustomException -> {
            // You have encountered a custom error thrown by the wallet.
            // If you made the API call with a request object that's a
            // subclass of CreateCustomCredentialRequest using a 3rd-party SDK,
            // then you should check for any custom exception type constants
            // within that SDK to match with e.type. Otherwise, drop or log the
            // exception.
        }
        else -> Log.w(TAG, "Unexpected exception type ${e::class.java}")
    }
}