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

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

ウォレットは、リクエストが届いたときに Credential Manager が認証情報をフィルタして認証情報セレクタに表示できるように、認証情報のメタデータを登録する必要があります。

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

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

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