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

発行者から認証情報を受信して保存するには、ホルダーアプリで発行フローを処理する必要があります。発行フローでは、発行者のウェブサイトまたはアプリからホルダーアプリに、認証情報のプロビジョニングに必要な情報が記載された認証情報のオファーが送信されます。ホルダーアプリは 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 と、発行者から送信された認証情報オファーを受け取る WebAssembly(Wasm)バイナリ ファイルです。これにより、認証情報マネージャー UI に表示されるエントリが決定されます。マッチャーの例については、 オープンソースのサンプルウォレットアプリをご覧ください。

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

次に、ユーザーが認証情報の作成オプションを選択したときにウォレットが処理を行う必要があります。サンプル ウォレットに示すように、 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)
}

作成レスポンスを返す

ウォレットが認証情報の保存に必要な手順を完了したら、認証情報のレスポンスを使用してアクティビティを終了します。

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

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