La verificación de credenciales digitales en las apps para Android se puede usar para autenticar y autorizar la identidad de un usuario (como una ID gubernamental), las propiedades sobre ese usuario (como una licencia de conducir, un título académico o atributos como la edad o la dirección) o en otras situaciones en las que se debe emitir y verificar una credencial para confirmar la autenticidad de una entidad.
Las credenciales digitales son un estándar público de incubadora del W3C que especifica cómo acceder a las credenciales digitales verificables de un usuario desde una billetera digital y se implementa para casos de uso web con la API de W3C Credential Management. En Android, se usa la API de DigitalCredential
del Administrador de credenciales para verificar las credenciales digitales.
Implementación
Para verificar las credenciales digitales en tu proyecto de Android, haz lo siguiente:
- Agrega dependencias a la secuencia de comandos de compilación de tu app y, luego, inicializa una clase
CredentialManager
. - Crea una solicitud de credencial digital y úsala para inicializar un
DigitalCredentialOption
y, luego, compila elGetCredentialRequest
. - Inicia el flujo
getCredential
con la solicitud creada para recibir unGetCredentialResponse
correcto o controlar cualquier excepción que pueda ocurrir. Una vez que se recupere correctamente, valida la respuesta.
Agrega dependencias y, luego, inícialas
Agrega las siguientes dependencias a tu secuencia de comandos de compilación de Gradle:
dependencies {
implementation("androidx.credentials:credentials:1.5.0-beta01")
implementation("androidx.credentials:credentials-play-services-auth:1.5.0-beta01")
}
A continuación, inicializa una instancia de la clase CredentialManager
.
val credentialManager = CredentialManager.create(context)
Crea una solicitud de credencial digital
Crea una solicitud de credencial digital y úsala para inicializar 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)
)
Obtén la credencial
Inicia el flujo de getCredential
con la solicitud creada. Recibirás un GetCredentialResponse
correcto o un GetCredentialException
si la solicitud falla.
El flujo getCredential
activa los diálogos del sistema Android para presentar las opciones de credenciales disponibles del usuario y recopilar su selección. A continuación, la app de billetera que contiene la opción de credencial elegida mostrará IUs para recopilar el consentimiento y realizar las acciones necesarias para generar una respuesta de credencial digital.
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}")
}
}