憑證管理工具 - 持有者 API

Credential Manager - Holder API 可讓 Android 應用程式管理數位憑證,並將憑證呈現給驗證者。

開始使用

如要使用 Credential Manager - Holder API,請將下列依附元件新增至應用程式模組的建構指令碼:

// 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" }

使用 Credential Manager 註冊憑證

錢包需要註冊憑證中繼資料,讓憑證管理工具在收到要求時,能夠篩選並在憑證選取器中顯示這些中繼資料。

圖片:顯示憑證管理工具中的數位憑證使用者介面
圖 1. 數位憑證 UI。

Credential Manager 選取器 UI

此中繼資料的格式會傳入 RegisterCredentialsRequest。建立 [RegistryManager][1] 並註冊憑證:

在這個範例中,中繼資料是從憑證項目資料庫編譯而成。您可以在範例錢包中找到參考資料,用於在應用程式載入時註冊中繼資料。日後,Jetpack API 將支援憑證資料庫組合。屆時,您可以將憑證中繼資料註冊為明確定義的資料結構。

登錄會在裝置重新啟動後保留。重新註冊相同 ID 和類型的登錄會覆寫先前的登錄記錄。因此,您只需在憑證資料變更時重新註冊即可。

選用:建立比對器

憑證管理工具是協定方,會將中繼資料註冊表視為不透明的 blob,且不會驗證或檢查其內容。因此,錢包必須提供比對器,也就是可執行的二進位檔,可處理錢包本身的資料,並根據傳入的要求產生顯示中繼資料。憑證管理工具會在沒有網路或磁碟存取權的沙箱環境中執行比對工具,因此在 UI 呈現給使用者前,不會有任何內容洩漏到錢包。

Credential Manager API 會為熱門通訊協定提供比對器,目前是 OpenID4VP。這項功能尚未正式發布,因此請先使用範例比對器,適用於 OpenID4VP v24 通訊協定

處理所選憑證

接著,錢包需要處理使用者選取憑證時的情況。您可以定義可監聽 androidx.credentials.registry.provider.action.GET_CREDENTIAL 意圖篩選器的活動。我們的範例錢包示範了這個程序

啟動活動的意圖會包含驗證器要求和呼叫來源,可使用 PendingIntentHandler.retrieveProviderGetCredentialRequest 函式擷取。API 會傳回 ProviderGetCredentialRequest,其中包含與指定驗證器要求相關的所有資訊。有三個主要元件:

驗證器通常會提出數位憑證呈現要求,您可以使用以下程式碼範例進行處理:

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

您可以在示例錢包中查看這類範例。

算繪錢包 UI

選取憑證後,系統會叫用錢包,並引導使用者前往其 UI。在本範例中,這是生物辨識提示

傳回憑證回應

錢包準備好傳回結果後,您可以使用憑證回應完成活動:

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

如果有例外狀況,您可以以類似方式傳送憑證例外狀況:

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

如需如何在結構定義中傳回憑證回應的範例,請參閱範例應用程式