如要接收及儲存核發機構的憑證,持有人應用程式必須處理核發流程。在核發流程中,核發者網站或應用程式會將憑證提供給持有者應用程式,詳細說明佈建憑證所需的資訊。持有人應用程式會使用 RegistryManager 向 Credential Manager 註冊要處理的憑證類型。這樣一來,使用者在提出憑證核發要求時,就能看到並選取該應用程式。
如要進一步瞭解憑證如何搭配 Holder API 運作,請參閱「Holder API 核心概念」。
Android 版本相容性
Android 6 (API 級別 23) 以上版本支援 Holder API。
實作
如要使用 Credential Manager Holder API,請將下列依附元件新增至應用程式模組的建構指令碼:
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 UI 中顯示哪些項目。如需比對工具範例,請參閱開放原始碼範例錢包應用程式。
處理核發要求
接著,錢包需要處理使用者選取憑證建立選項的情況。定義會監聽 androidx.credentials.registry.provider.action.CREATE_CREDENTIAL 意圖篩選器的活動,如範例錢包所示。
啟動活動的意圖包含建立要求和呼叫來源,您可以使用 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)
}
金鑰認證
請注意金鑰認證的下列事項:
- 產生金鑰認證時,您可能會使用
BigInteger.toByteArray()將金鑰內容轉換為 JSON 網頁金鑰等格式。這個方法有時會新增符號位元組,導致驗證錯誤。 如果發生這種情況,請先移除這些位元組,再將金鑰認證傳送給簽發者。 - 建議使用
android_key_attestation做為金鑰證明類型。
傳回建立回應
錢包完成儲存憑證所需的步驟後,請使用憑證回應結束活動:
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()
如要查看在情境中傳回憑證回應的完整範例,請參閱範例應用程式。