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:
- Ajoutez des dépendances au script de compilation de votre application et initialisez une classe
CredentialManager
. - Créez une requête d'identifiants numériques et utilisez-la pour initialiser un
DigitalCredentialOption
, puis créez leGetCredentialRequest
. - Lancez le flux
getCredential
avec la requête créée pour recevoir uneGetCredentialResponse
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}")
}
}