La verifica delle credenziali digitali all'interno delle app per Android può essere utilizzata per autenticare e autorizzare l'identità di un utente (ad esempio un documento di identità), le proprietà relative all'utente (ad esempio una patente di guida, un diploma accademico o attributi come l'età o l'indirizzo) o altri scenari in cui è necessario emettere e verificare una credenziale per affermare l'autenticità di un'entità.
Le credenziali digitali sono uno standard pubblico dell'incubatore W3C che specifica come accedere alle credenziali digitali verificabili di un utente da un portafoglio digitale e sono implementate per i casi d'uso web con l'API W3C Credential Management. Su Android, l'API DigitalCredential
di Gestore delle credenziali viene utilizzata per verificare le credenziali digitali.
Implementazione
Per verificare le credenziali digitali nel progetto Android:
- Aggiungi le dipendenze allo script di compilazione dell'app e inizializza una classe
CredentialManager
. - Crea una richiesta di credenziale digitale e utilizzala per inizializzare un
DigitalCredentialOption
, quindi crea ilGetCredentialRequest
. - Avvia il flusso
getCredential
con la richiesta creata per ricevere unGetCredentialResponse
positivo o gestire eventuali eccezioni che potrebbero verificarsi. Al termine del recupero, convalida la risposta.
Aggiungi le dipendenze e inizializza
Aggiungi le seguenti dipendenze allo script di build di Gradle:
dependencies {
implementation("androidx.credentials:credentials:1.5.0-beta01")
implementation("androidx.credentials:credentials-play-services-auth:1.5.0-beta01")
}
Poi, inizializza un'istanza della classe CredentialManager
.
val credentialManager = CredentialManager.create(context)
Creare una richiesta di credenziali digitali
Crea una richiesta di credenziale digitale e utilizzala per inizializzare 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)
)
Ottieni la credenziale
Avvia il flusso getCredential
con la richiesta creata. Riceverai un GetCredentialResponse
di esito positivo o un GetCredentialException
se la richiesta non va a buon fine.
Il flusso getCredential
attiva le finestre di dialogo del sistema Android per presentare all'utente le opzioni di credenziali disponibili e raccogliere la sua selezione. Successivamente, l'app wallet contenente l'opzione della credenziale scelta mostrerà interfacce utente per raccogliere il consenso ed eseguire le azioni necessarie per generare una risposta con credenziale digitale.
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}")
}
}