Processar a emissão de credenciais com o app da carteira

Para receber e armazenar credenciais de emissores, o app de titular precisa processar fluxos de emissão. Em um fluxo de emissão, o site ou app do emissor envia uma oferta de credencial ao app de titular detalhando as informações necessárias para provisionar uma credencial. O app de titular usa RegistryManager para registrar no Credential Manager os tipos de credenciais que pretende processar. Isso permite que o app seja mostrado e selecionado pelo usuário durante uma solicitação de emissão para receber a credencial.

Para mais informações sobre como as credenciais funcionam com a API Holder, leia os conceitos básicos da API Holder.

Compatibilidade com a versão do Android

A API Holder é compatível com o Android 6 (nível 23 da API) e versões mais recentes.

Implementação

Para usar a API Holder do Gerenciador de credenciais, adicione as dependências abaixo ao script de build do módulo do app:

Groovy

dependencies {
    // Use to implement credentials registrys

    implementation "androidx.credentials.registry:registry-digitalcredentials-mdoc:1.0.0-alpha04"
    implementation "androidx.credentials.registry:registry-digitalcredentials-openid:1.0.0-alpha04"
    implementation "androidx.credentials.registry:registry-digitalcredentials-sdjwtvc:1.0.0-alpha04"
    implementation "androidx.credentials.registry:registry-provider:1.0.0-alpha04"
    implementation "androidx.credentials.registry:registry-provider-play-services:1.0.0-alpha04"

}

Kotlin

dependencies {
    // Use to implement credentials registrys

    implementation("androidx.credentials.registry:registry-digitalcredentials-mdoc:1.0.0-alpha04")
    implementation("androidx.credentials.registry:registry-digitalcredentials-openid:1.0.0-alpha04")
    implementation("androidx.credentials.registry:registry-digitalcredentials-sdjwtvc:1.0.0-alpha04")
    implementation("androidx.credentials.registry:registry-provider:1.0.0-alpha04")
    implementation("androidx.credentials.registry:registry-provider-play-services:1.0.0-alpha04")

}

Criar o RegistryManager

Crie uma instância RegistryManager e registre uma solicitação RegisterCreationOptionsRequest com ela.

val registryManager = RegistryManager.create(context)

try {
    registryManager.registerCreationOptions(object :
        RegisterCreationOptionsRequest(
            creationOptions = buildIssuanceData(),
            matcher = loadIssuanceMatcher(),
            type = DigitalCredential.TYPE_DIGITAL_CREDENTIAL,
            id = "openid4vci",
        ) {}
    )
} catch (e: Exception) {
    Log.e(TAG, "Issuance registration failed.", e)
}

O matcher é um arquivo binário do WebAssembly (Wasm) que vai receber o creationOptions definido durante o registro e a oferta de credencial enviada pelo emissor para determinar as entradas mostradas na interface do Credential Manager. Consulte o exemplo de app de carteira de código aberto para ver um exemplo de matcher.

Processar uma solicitação de emissão

Em seguida, a carteira precisa processar quando uma opção de criação de credencial é selecionada pelo usuário. Defina uma atividade que detecte o androidx.credentials.registry.provider.action.CREATE_CREDENTIAL filtro de intent, conforme demonstrado na carteira de exemplo.

A intent que inicia a atividade contém a solicitação de criação e a origem da chamada, que podem ser extraídas com a função PendingIntentHandler.retrieveProviderCreateCredentialRequest. A API retorna um ProviderCreateCredentialRequest que contém todas as informações associadas à solicitação de criação. Há dois componentes principais:

  • O app que fez a solicitação. É possível recuperar isso com getCallingAppInfo.
  • A solicitação do app de chamada. É possível recuperar isso com getCallingRequest, que retorna um CreateCredentialRequest. Se a solicitação for de credenciais digitais, ela será uma instância de CreateDigitalCredentialRequest, que contém o JSON da solicitação de emissão na propriedade requestJson. É possível processar isso com o exemplo de código abaixo:
val pendingIntentRequest =
    PendingIntentHandler.retrieveProviderCreateCredentialRequest(intent)
val request = pendingIntentRequest!!.callingRequest
if (request is CreateDigitalCredentialRequest) {
    Log.i(TAG, "Got DC creation request: ${request.requestJson}")
    processCreationRequest(request.requestJson)
}

Atestado de chaves

Observe o seguinte sobre o atestado de chaves:

  • Ao gerar um atestado de chaves, você pode usar BigInteger.toByteArray() para converter os materiais de chave em, por exemplo, uma chave da Web JSON. Esse método às vezes pode adicionar um byte de sinal e causar um erro de validação. Se isso acontecer, remova esses bytes antes de enviar o atestado de chaves ao emissor.
  • Recomendamos usar o android_key_attestation como o tipo de prova de chave.

Retornar a resposta de criação

Quando a carteira terminar as etapas necessárias para salvar a credencial, conclua a atividade com a resposta da credencial:

val resultData = Intent()
PendingIntentHandler.setCreateCredentialResponse(
    resultData,
    CreateDigitalCredentialResponse(response.responseJson)
)
setResult(RESULT_OK, resultData)
finish()

Se houver uma exceção, você poderá enviar a exceção de credencial da mesma forma:

val resultData = Intent()
PendingIntentHandler.setCreateCredentialException(
    resultData,
    CreateCredentialUnknownException() // Configure the proper exception
)
setResult(RESULT_OK, resultData)
finish()

Para conferir um exemplo completo de como retornar a resposta da credencial no contexto, consulte o app de exemplo.