Google ウォレットの身分証明書を確認する

オンライン

デジタル ID は、アプリ内フローおよびウェブフローでも受け付けることができます。Google ウォレットの認証情報を確認するには、次の要件を満たす必要があります。

  1. 提供された手順に沿ってアプリまたはウェブを使用して統合します。
  2. こちらのフォームに記入して、Google ウォレットからの認証情報の受け入れに関する利用規約をリクエストし、同意します。

前提条件

身分証明書の提示をテストするには、まず、対象のテスト アカウントを使用して公開ベータ版プログラムに登録する必要があります。その後、Google の担当者に詳細情報を提供してください。

  • 利用規約へのリンク
  • ロゴ
  • ウェブサイト
  • Play ストアのパッケージ ID(Android アプリの統合用)
  • 公開ベータ版への参加に使用した Gmail ID

サポートされている認証情報の形式

デジタル身分証明書のデータ形式を定義する標準案がいくつかありますが、その中でも次の 2 つが業界で大きな支持を得ています。

  1. mdoc - ISO で定義されています。
  2. W3C 検証可能な認証情報 - W3C で定義されています。

Android 認証情報マネージャーは両方の形式をサポートしていますが、Google ウォレットは現在、mdoc ベースのデジタル ID のみをサポートしています。

ユーザー エクスペリエンス

アプリケーションが ID 属性をリクエストすると、次の処理が行われます。

  1. 認証情報の検出: アプリケーションは、使用可能なウォレットをクエリして、リクエストを満たす認証情報を特定します。Android はシステム UI セレクタを提示し、共有される情報を表示します。これにより、ユーザーは情報に基づいてどの認証情報を使用するかを決定できます。

  2. ユーザーの選択とウォレットの操作: ユーザーが認証情報を選択すると、Android が対応するウォレット アプリを呼び出して取引を完了します。ウォレット アプリが独自の同意画面を表示する場合や、生体認証による確認が必要な場合があります。

結果: ユーザーが同意すると、選択した ID 認証情報がリクエスト元のアプリケーションと共有されます。ユーザーが拒否すると、エラーが返されます。

アプリ内

Android アプリから ID 認証情報をリクエストする手順は次のとおりです。

依存関係を更新する

プロジェクトの build.gradle で、認証情報マネージャー(ベータ版)を使用するように依存関係を更新します。

dependencies {
    implementation("androidx.credentials:credentials:1.5.0-alpha05")
    // optional - needed for credentials support from play services, for devices running Android 13 and below.
    implementation("androidx.credentials:credentials-play-services-auth:1.5.0-alpha05")
}

Credential Manager を構成する

CredentialManager オブジェクトを構成して初期化するには、次のようなロジックを追加します。

// Use your app or activity context to instantiate a client instance of CredentialManager.
val credentialManager = IdentityCredentialManager.Companion.getClient(context)

リクエスト ID 属性

// Retrieves the user's digital identites from wallet apps for your app.
val getIdentityCredentialOption = GetDigitalCredentialOption(
    requestJson = requestJson, // this is what partners needs to set, example JSON specified below
)
val result = credentialManager.getCredential(request = GetCredentialRequest(credentialOptions, ...)

アプリ呼び出し元は、すべての IdentityRequest パラメータを JSON 文字列として提供します。ここでは、CredentialOption の requestMatcher パラメータとして表されます。認証情報マネージャーは、その JSON の内容には関与しません。この JSON リクエストは直接ウォレットに渡されます。ウォレットはそれを解析して、リクエストに対応できる認証情報を決定します。実装全体はサンプルアプリで確認できます。

W3C では、この JSON リクエストをウェブ API のコンポーネントとして定義する予定です。この標準化により、ブラウザはリクエストを Android に直接送信できるようになります。

リクエストの内容を示すために、mdoc リクエストの例を以下に示します。

{
  "selector": {
    "format": [
      "mdoc"
    ],
    "doctype": "org.iso.18013.5.1.mDL",
    "fields": [
      {
        "namespace": "org.iso.18013.5.1",
        "name": "family_name",
        "intentToRetain": false
      },
      {
        "namespace": "org.iso.18013.5.1",
        "name": "given_name",
        "intentToRetain": false
      },
      {
        "namespace": "org.iso.18013.5.1",
        "name": "age_over_21",
        "intentToRetain": false
      }
    ]
  },
  "nonce": "3cydsUF9xNFyBDAAWOct09hEeSqrFX2WB2r0G6f8Ol0=",
  "readerPublicKey": "BApmGdElal2-1dtafsdHVRa1EpAWZfhlQj_iof2I8L3V8_dCK1gVR0_12E4ZSQ2LcqXRd4zxVeKEqU1wUSgGWUU="
}

レスポンスには、W3C で定義された identityToken(JSON 文字列)が返されます。このレスポンスを作成するのはウォレット アプリです。

例:

{
    "token": "<base64 encoded response>"
}

トークンを送信してサーバーで処理する

アプリケーションは identityToken を受け取ったら、検証のためにそれをアプリケーション サーバーに送信する必要があります。最初のステップでは、トークンを Base64 形式からデコードします。生成されたバイト配列は、次の CDDL に準拠する CBOR データを表します。

CredentialDocument = {
  "version": tstr,       // Set to "ANDROID-HPKE-v1"
  "pkEm": bstr,          // Public key, in uncompressed form
  "cipherText": bstr     // The encrypted data
}

次のステップでは、Android 固有のハンドオーバー構造を使用して、ISO/IEC 18013-5:2021 の SessionTranscript を計算します。

SessionTranscript = [
  null,                // DeviceEngagementBytes not available
  null,                // EReaderKeyBytes not available
  AndroidHandover      // Defined below
]

AndroidHandover = [
  "AndroidHandoverv1", // Version number
  nonce,               // nonce that comes from request
  appId,               // RP package name
  pkRHash,             // The SHA256 hash of the recipient public key
]

cipherText は HPKE 暗号化を使用して暗号化されます。復号するには、追加の認証データとして SessionTranscript を使用し、前に生成した EC 秘密鍵と次の設定を使用します。

  • KEM: DHKEM(P-256、HKDF-SHA256)
  • KDF: HKDF-SHA256
  • AEAD: AES-128-GCM

結果のクリアテキストは、ISO/IEC 18013-5:2021 で定義されている DeviceResponse CBOR バイトです。DeviceResponse は、ISO/IEC 18013-5:2021 の条項 9 に従って検証する必要があります。これには、mdoc が信頼できる発行元から発信されたこと、レスポンスが目的のデバイスによって署名されていることを確認するなどの手順が含まれます。この検証プロセスの一部には、OpenWallet Foundation ID 認証情報プロジェクトDeviceResponseParser クラスを使用できます。

ウェブ

Chrome で Digital Credentials API を使用して ID 認証情報をリクエストするには、Digital Credentials API のオリジン トライアルに登録する必要があります。

対面

Google ウォレットの身分証明書を確認する手順は次のとおりです。

  • ISO 18013-5 で定義されている身分証明書を確認するためのリーダーを作成または取得する
  • IACA 証明書をリーダーに読み込んで、確認しようとしている身分証明書が本物であることをチェックする
  • ソリューションをテストする
  • アプリケーションを Google ウォレットに登録する

ISO 18013-5 で定義されている身分証明書を確認するためのリーダーを作成または取得する

ウォレットの身分証明書は、モバイル運転免許証の ISO 18013-5 標準に従って実装されます。データ転送メカニズムとして BLE とともに NFC ベースまたは QR コードのエンゲージメントを使用しているため、標準のこのような機能を実装できるデバイスであればリーダーとして使用できます。モバイル アプリケーションをリーダーとして使用することもできます。標準が公開されているため、複数のサードパーティによる実装が市販されています。必要に応じて、自組織で機能を直接実装することもできます。

この機能を独自に実装する方法については、オープンソース リファレンス リーダーの Android アプリをご覧ください。このアプリは ISO 標準を実装し、Google ウォレットのモバイル運転免許証に対応しています。

最初に、リファレンス リーダー アプリをビルドして実行します。

  • リファレンス アプリのリポジトリのクローンを作成します。
  • Android Studio でプロジェクトを開きます。
  • appverifier ターゲットをビルドし、Android デバイスまたはエミュレータで実行します。

IACA 証明書をリーダーに読み込んで、確認しようとしている身分証明書が本物であることをチェックする

本物の認証情報であることを検証するには、サポートされている発行元のウォレット内に身分証明書が含まれている必要があります。Google ウォレットでサポートされている発行元のリストと、検証用の証明書へのリンクを以下に示します。

ソリューションをテストする

ソリューションをテストするには、Google のオープンソース リファレンス ホルダーである Android アプリをビルドして実行します。リファレンス ホルダー アプリをビルドして実行する手順は次のとおりです。

  • リファレンス アプリのリポジトリのクローンを作成します。
  • Android Studio でプロジェクトを開きます。
  • appholder ターゲットをビルドし、Android デバイスまたはエミュレータで実行します。

(省略可)Google ウォレットにアプリケーションを登録する

こちらのフォームに記入して、Google ウォレットにアプリケーションを登録します。