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 が認証情報をフィルタして認証情報セレクタに表示できるように、認証情報のメタデータを登録する必要があります。

認証情報マネージャーの選択ツール UI
このメタデータの形式は RegisterCredentialsRequest
に渡されます。[RegistryManager][1]
を作成し、認証情報を登録します。
この例では、メタデータは認証情報エントリのデータベースからコンパイルされます。アプリの読み込み時にメタデータを登録するサンプル ウォレットのリファレンスをご覧ください。今後、認証情報データベースの構成は Jetpack API でサポートされる予定です。その時点で、認証情報のメタデータを適切に定義されたデータ構造として登録できます。
レジストリはデバイスの再起動後も保持されます。同じ ID とタイプで同じレジストリを再登録すると、以前のレジストリ レコードが上書きされます。したがって、再登録が必要になるのは、認証情報データが変更された場合のみです。
省略可: マッチャーを作成する
Credential Manager はプロトコルに依存しません。メタデータ レジストリを不透明な BLOB として扱い、その内容を検証またはチェックしません。そのため、ウォレットは、ウォレット自身のデータを処理し、受信したリクエストに基づいて表示メタデータを生成できる、実行可能なバイナリであるマッチャーを提供する必要があります。Credential Manager は、ネットワークやディスクにアクセスできないサンドボックス環境でマッチャーを実行します。これにより、UI がユーザーにレンダリングされる前に、ウォレットに情報が漏洩することはありません。
Credential Manager API は、一般的なプロトコル(現時点では OpenID4VP)のマッチャーを提供します。まだ正式にリリースされていないため、当面は OpenID4VP プロトコル用のサンプル マッチャーを使用してください。
選択された認証情報を処理する
次に、ウォレットはユーザーが認証情報を選択したときの処理を行う必要があります。androidx.credentials.registry.provider.action.GET_CREDENTIAL
インテント フィルタをリッスンするアクティビティを定義できます。サンプル ウォレットでこの手順を示しています。
アクティビティを起動するインテントには、検証ツール リクエストと呼び出し元が含まれます。これらは PendingIntentHandler.retrieveProviderGetCredentialRequest
関数で抽出できます。API は、指定された検証ツール リクエストに関連付けられているすべての情報を含む ProviderGetCredentialRequest
を返します。3 つの主要なコンポーネントがあります。
- リクエストを行ったアプリ。これは
getCallingAppInfo
で取得できます。 - 選択した認証情報。ユーザーが選択した候補に関する情報は、
selectedEntryId
拡張メソッドで取得できます。これは、登録した認証情報 ID と一致します。 - 検証者が行った具体的なリクエスト。これは
getCredentialOptions
メソッドから取得できます。この場合、このリストにGetDigitalCredentialOption
が含まれており、デジタル クレデンシャルのリクエストが含まれているはずです。
通常、検証ツールはデジタル認証情報の提示リクエストを行うため、次のサンプルコードで処理できます。
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()
コンテキストで認証情報レスポンスを返す方法の例については、サンプルアプリをご覧ください。