認証情報マネージャー - Holder 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" }

認証情報マネージャーに認証情報を登録する

ウォレットは、認証情報メタデータを登録する必要があります。これにより、認証情報マネージャーはリクエストを受信したときに、認証情報をフィルタして認証情報セレクタに表示できます。

認証情報マネージャーのデジタル認証情報の UI を示す画像
図 1. デジタル認証情報の UI

認証情報マネージャー選択ツールの 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 を返します。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()

認証情報レスポンスをコンテキスト内で返す方法の例については、サンプルアプリをご覧ください。