ホルダーアプリで認証情報の発行を処理する

発行者から認証情報を受け取って保存するには、ホルダーアプリで発行フローを処理する必要があります。発行フローでは、発行者のウェブサイトまたはアプリが、認証情報のプロビジョニングに必要な情報を詳しく説明する認証情報オファーをホルダーアプリに送信します。ホルダーアプリは RegistryManager を使用して、処理する認証情報のタイプを認証情報マネージャーに登録します。これにより、認証情報の発行リクエスト中にアプリがユーザーに表示され、ユーザーがアプリを選択して認証情報を受け取ることができます。

認証情報が Holder API でどのように機能するかについて詳しくは、Holder API の基本コンセプトをご覧ください。

Android バージョンの互換性

Holder API は、Android 6(API レベル 23)以上でサポートされています。

実装

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)
}

マッチャーは、登録時に設定された creationOptions と、発行元から送信された認証情報の提案を受け取り、認証情報マネージャー UI に表示されるエントリを決定する WebAssembly(Wasm)バイナリ ファイルです。マッチャーの例については、オープンソースのウォレット アプリの例をご覧ください。

発行リクエストを処理する

次に、ユーザーが認証情報作成オプションを選択したときにウォレットが処理する必要があります。サンプル ウォレットで示されているように、androidx.credentials.registry.provider.action.CREATE_CREDENTIAL インテント フィルタをリッスンするアクティビティを定義します。

アクティビティを起動するインテントには、作成リクエストと呼び出し元が含まれています。これらは PendingIntentHandler.retrieveProviderCreateCredentialRequest 関数で抽出できます。API は、作成リクエストに関連するすべての情報を含む ProviderCreateCredentialRequest を返します。主なコンポーネントは次の 2 つです。

  • リクエストを行ったアプリ。これは 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()

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