API de Credential Manager - Holder

La API de Credential Manager - Holder permite que las apps para Android administren y presenten credenciales digitales a los verificadores.

Comenzar

Para usar la API de Credential Manager - Holder, agrega las siguientes dependencias a la secuencia de comandos de compilación del módulo de tu app:

// In your app module's build.gradle:
dependencies {
    implementation(libs.androidx.registry.provider)
    implementation(libs.androidx.registry.provider.play.services)
}

// In libs.versions.toml:
registryDigitalCredentials = "1.0.0-alpha01"

androidx-registry-provider = { module = "androidx.credentials.registry:registry-provider", version.ref = "registryDigitalCredentials" }
androidx-registry-provider-play-services = { module = "androidx.credentials.registry:registry-provider-play-services", version.ref = "registryDigitalCredentials" }

Cómo registrar credenciales con el Administrador de credenciales

Una billetera debe registrar metadatos de credenciales para que Credential Manager pueda filtrarlos y mostrarlos en el selector de credenciales cuando se recibe una solicitud.

Imagen que muestra la IU de credenciales digitales en el Administrador de credenciales
Figura 1: Es la IU de las credenciales digitales.

La IU del selector de Credential Manager

El formato de estos metadatos se pasa a un RegisterCredentialsRequest. Crea un [RegistryManager][1] y registra las credenciales:

En este ejemplo, los metadatos se compilan a partir de una base de datos de entradas de credenciales. Puedes encontrar una referencia en nuestra billetera de ejemplo que registra los metadatos cuando se carga la app. En el futuro, la API de Jetpack admitirá la composición de la base de datos de credenciales. En ese punto, también puedes registrar los metadatos de las credenciales como estructuras de datos bien definidas.

El registro persiste después de que se reinicia el dispositivo. Si se vuelve a registrar el mismo registro con el mismo ID y tipo, se reemplazará el registro anterior. Por lo tanto, solo deberás volver a registrarte cuando cambien los datos de tus credenciales.

Opcional: Crea un comparador

Credential Manager es independiente del protocolo, ya que trata el registro de metadatos como un BLOB opaco y no verifica ni comprueba su contenido. Por lo tanto, la billetera debe proporcionar un comparador, un archivo binario ejecutable que pueda procesar los propios datos de la billetera y generar los metadatos de visualización en función de una solicitud entrante. Credential Manager ejecutará el comparador en un entorno de zona de pruebas sin acceso a la red ni al disco, de modo que no se filtre nada a una billetera antes de que se renderice la IU para el usuario.

La API de Credential Manager proporcionará comparadores para protocolos populares, como OpenID4VP. Aún no se lanzó oficialmente, por lo que, por ahora, usa nuestro comparador de muestras para el protocolo OpenID4VP.

Cómo controlar una credencial seleccionada

A continuación, la billetera debe controlar cuando el usuario selecciona una credencial. Puedes definir una actividad que escuche el filtro de intents androidx.credentials.registry.provider.action.GET_CREDENTIAL. Nuestra billetera de ejemplo muestra este procedimiento.

El intent que inicia la actividad contendrá la solicitud del verificador y el origen de la llamada, que se pueden extraer con la función PendingIntentHandler.retrieveProviderGetCredentialRequest. La API devuelve un ProviderGetCredentialRequest que contiene toda la información asociada con la solicitud del verificador determinada. Hay tres componentes clave:

  • Es la app que realizó la solicitud. Puedes recuperar este valor con getCallingAppInfo.
  • Es la credencial seleccionada. Puedes obtener información sobre qué candidato eligió el usuario a través del método de extensión selectedEntryId, que coincidirá con el ID de credencial que registraste.
  • Cualquier solicitud específica que haya realizado el verificador Puedes obtenerlo del método getCredentialOptions. En este caso, deberías encontrar un objeto GetDigitalCredentialOption en esta lista, que contiene la solicitud de credenciales digitales.

Por lo general, el verificador realizará una solicitud de presentación de credenciales digitales para que puedas procesarla con el siguiente código de ejemplo:

request.credentialOptions.forEach { option ->
    if (option is GetDigitalCredentialOption) {
        Log.i(TAG, "Got DC request: ${option.requestJson}")
        processRequest(option.requestJson)
    }
}

Puedes ver un ejemplo de esto en nuestra billetera de muestra.

Renderiza la IU de la billetera

Una vez que se selecciona la credencial, se invoca la billetera y se lleva al usuario a través de su IU. En la muestra, esta es una solicitud biométrica.

Devuelve la respuesta de credenciales

Una vez que la billetera esté lista para devolver el resultado, puedes finalizar la actividad con la respuesta de credenciales:

PendingIntentHandler.setGetCredentialResponse(
    resultData,
    GetCredentialResponse(DigitalCredential(response.responseJson))
)
setResult(RESULT_OK, resultData)
finish()

Si hay una excepción, puedes enviar la excepción de credenciales de manera similar:

PendingIntentHandler.setGetCredentialException(
    resultData,
    GetCredentialUnknownException() // Configure the proper exception
)
setResult(RESULT_OK, resultData)
finish()

Consulta la app de ejemplo para ver un ejemplo de cómo devolver la respuesta de credenciales en contexto.