正在接受來自 Google 錢包的身分證件

線上活動

數位身分證件可用於應用程式內網站流程。如要接受 Google 錢包的憑證,您必須:

  1. 按照提供的指示,使用應用程式或網頁進行整合,
  2. 如要申請並同意從 Google 錢包接受憑證的服務條款,請填寫這份表單

必要條件

如要測試 ID 呈現方式,您必須先使用指定的測試帳戶註冊公開 Beta 版計畫。接著,請將下列詳細資料提供給指定的 Google 聯絡窗口。

  • 服務條款連結
  • 標誌
  • 網站
  • Play 商店套件 ID (適用於 Android 應用程式整合)
  • 用於加入公開測試的 Gmail ID

支援的憑證格式

市面上有幾種建議的標準定義了數位身分證明文件的資料格式,而業界有兩項重大的業界關注:

  1. mdocs:由 ISO 定義。
  2. W3C 可驗證憑證:由 W3C 定義。

雖然 Android 憑證管理工具支援這兩種格式,但 Google 錢包目前僅支援以 mdoc 為基礎的數位身分證件。

使用者體驗

當應用程式要求身分屬性時,會發生以下流程:

  1. 憑證探索:應用程式會查詢可用的錢包,找出可滿足要求的憑證。接著,Android 會顯示系統 UI 選取器,顯示要共用的資訊。這可讓使用者在充分掌握資訊後,決定要使用哪個憑證。

  2. 使用者選取項目和錢包互動:使用者選取憑證後,Android 會叫用對應的錢包應用程式,完成交易。錢包應用程式可能會顯示自己的同意畫面,或要求使用生物特徵辨識功能進行確認。

結果:如果使用者同意,系統會將所選身分證件提供給要求的應用程式。如果使用者拒絕,系統會傳回錯誤。

應用程式內

如要從 Android 應用程式要求身分憑證,請按照下列步驟操作:

更新依附元件

在專案的 build.gradle 檔案中更新依附元件,以便使用 Credential Manager (Beta 版):

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)

要求身分屬性

// 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, ...)

應用程式呼叫端會以 JSON 字串提供所有 IdentityRequest 參數。此處將其表示為 CredentialOption 的 requestMatcher 參數。憑證管理工具不會關心該 JSON 的內容。這項 JSON 要求會直接傳送至錢包,錢包會負責剖析這項要求,並決定哪些憑證可以滿足要求。完整導入方式請參閱範例應用程式

我們預期 W3C 會將這項 JSON 要求定義為 Web 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 格式權杖解碼。產生的位元組陣列代表 CBOR 資料,且遵循下列 CDDL。

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

接下來,我們將使用 Android 專屬的 Handover 結構體,根據 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 Identity Credential 專案中的 DeviceResponseParser 類別。

網路

如要在 Chrome 上使用 Digital Credentials API 要求身分憑證,您必須註冊 Digital Credentials API 來源試用

現場活動

如要接受 Google 錢包中的身分證件,請按照下列步驟操作:

  • 建構或取得讀取器,以接受 ISO 18013-5 定義的 ID
  • 將 IACA 憑證載入讀取器中,確定所接受的 ID 真實
  • 測試解決方案
  • 將應用程式註冊至 Google 錢包

建構或取得讀取器,以便接受 ISO 18013-5 定義的 ID

錢包中的身分證件是根據 ISO 18013-5 行動駕照標準實作。這些標準使用 NFC 或 QR code 互動功能,並搭配 BLE 做為資料傳輸機制,因此任何可實作這些標準的裝置都能充當讀取器,甚至是行動應用程式。由於標準是開放的,因此市場上有幾種第三方實作方式可供選擇。您也可以視需要直接實作功能。

如需自行實作這項功能的指引,請參閱我們的 Android 開放原始碼參考讀取器 app,這個應用程式可實作 ISO 標準,並接受 Google 錢包中的 mDL。

如要開始使用,請建立並執行參考閱讀器應用程式:

  • 複製參考應用程式存放區
  • Android Studio 中開啟專案
  • 在 Android 裝置或模擬器上建構及執行 appverifier 目標。

將 IACA 憑證載入讀取器,確保系統接受的身分證件均為真品

如要驗證實體憑證,您必須在錢包中擁有支援發證機構核發的身分證件。下方列出 Google 電子錢包支援的發卡機構,以及其憑證的驗證連結。

測試解決方案

如要測試您的解決方案,請建構並執行我們的開放原始碼參考資料持有者 Android 應用程式。以下是建構及執行參照資料容器應用程式的步驟:

  • 複製參考應用程式存放區
  • Android Studio 中開啟專案
  • 在 Android 裝置或模擬器上建構並執行 appholder 目標。

(選用) 將應用程式註冊至 Google 錢包

如要將應用程式註冊至 Google 錢包,請填寫這份表單