为了接收和存储来自签发方的凭据,持有者应用需要处理签发流程。在签发流程中,签发方网站或应用会向持有者应用发送凭据提供,其中详细说明了预配凭据所需的信息。持有者应用使用 RegistryManager 向 Credential Manager 注册其打算处理的凭据类型。这样,在签发凭据的请求期间,应用便可显示给用户并由用户选择。
如需详细了解凭据如何与 Holder API 搭配使用,请参阅 Holder API 核心概念。
Android 版本兼容性
Android 6(API 级别 23)及更高版本支持 Holder API。
实现
如需使用 Credential Manager Holder API,请将以下依赖项添加到应用模块的 build 脚本中:
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") }
创建 RegistryManager
创建 RegistryManager 实例并向其注册 RegisterCreationOptionsRequest 请求。
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)
}
匹配器是一个 WebAssembly (Wasm) 二进制文件,它将接收注册期间设置的 creationOptions 和签发者发送的凭据提供,以确定 Credential Manager 界面上显示的条目。如需查看匹配器的示例,请参阅开源示例钱包应用。
处理签发请求
接下来,钱包需要处理用户选择凭据创建选项的情况。定义一个监听 androidx.credentials.registry.provider.action.CREATE_CREDENTIAL intent 过滤器的 activity,如示例钱包中所示。
启动 activity 的 intent 包含创建请求和调用来源,您可以使用 PendingIntentHandler.retrieveProviderCreateCredentialRequest 函数提取这些信息。该 API 会返回一个 ProviderCreateCredentialRequest,其中包含与创建请求关联的所有信息。有两个关键组成部分:
- 发出请求的应用。您可以使用
getCallingAppInfo检索此内容。 - 来自调用应用的请求。您可以使用
getCallingRequest检索此请求,该方法会返回CreateCredentialRequest。如果请求是针对数字凭据的,则它是CreateDigitalCredentialRequest的实例,其中包含requestJson属性中的签发请求 JSON。您可以使用以下示例代码处理该数据:
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)
}
返回创建响应
钱包完成保存凭据所需的步骤后,使用凭据响应结束 activity:
val resultData = Intent()
PendingIntentHandler.setCreateCredentialResponse(
resultData,
CreateDigitalCredentialResponse(response.responseJson)
)
setResult(RESULT_OK, resultData)
finish()
如果存在例外情况,您可以类似地发送凭据异常:
val resultData = Intent()
PendingIntentHandler.setCreateCredentialException(
resultData,
CreateCredentialUnknownException() // Configure the proper exception
)
setResult(RESULT_OK, resultData)
finish()
如需查看在上下文中返回凭据响应的完整示例,请参阅示例应用。