การยอมรับบัตรประจำตัวจาก Google Wallet

ออนไลน์

ระบบจะยอมรับบัตรประจำตัวดิจิทัลทั้งแบบในแอปและเว็บ หากต้องการยอมรับข้อมูลเข้าสู่ระบบจาก Google Wallet คุณจะต้องดำเนินการดังนี้

  1. ผสานรวมโดยใช้แอปหรือเว็บโดยทําตามวิธีการที่ระบุไว้ และ
  2. กรอกแบบฟอร์มนี้เพื่อขอและยอมรับข้อกำหนดในการให้บริการของการรับข้อมูลเข้าสู่ระบบจาก Google Wallet

ข้อกำหนดเบื้องต้น

หากต้องการทดสอบการแสดงบัตรประจำตัว คุณต้องลงทะเบียนเข้าร่วมโปรแกรมเบต้าแบบสาธารณะโดยใช้บัญชีทดสอบที่ต้องการก่อน จากนั้นให้ส่งรายละเอียดต่อให้กับผู้ติดต่อ Google ที่คุณกำหนด

  • ลิงก์ข้อกำหนดในการให้บริการ
  • โลโก้
  • เว็บไซต์
  • รหัสแพ็กเกจ Play Store (สำหรับการผสานรวมแอป Android)
  • รหัส Gmail ที่ใช้เพื่อเข้าร่วมเวอร์ชันเบต้าแบบสาธารณะ

รูปแบบข้อมูลเข้าสู่ระบบที่รองรับ

มาตรฐานที่เสนอมีหลายรายการซึ่งกำหนดรูปแบบข้อมูลของเอกสารระบุตัวตนดิจิทัล โดยมี 2 รายการที่ได้รับความนิยมอย่างมากในอุตสาหกรรม ดังนี้

  1. mdocs - กำหนดโดย ISO
  2. W3C Verifiable Credentials - กำหนดโดย W3C

แม้ว่าเครื่องมือจัดการข้อมูลเข้าสู่ระบบของ Android จะรองรับทั้ง 2 รูปแบบ แต่ Google Wallet รองรับเฉพาะบัตรประจำตัวดิจิทัลแบบ mdoc เท่านั้นในขณะนี้

ประสบการณ์ของผู้ใช้

เมื่อแอปพลิเคชันขอแอตทริบิวต์ตัวตน ระบบจะดำเนินการตามขั้นตอนต่อไปนี้

  1. การค้นหาข้อมูลเข้าสู่ระบบ: แอปพลิเคชันจะค้นหากระเป๋าสตางค์ที่ใช้ได้เพื่อระบุข้อมูลเข้าสู่ระบบที่ตอบสนองคำขอได้ จากนั้น Android จะแสดงตัวเลือก UI ของระบบ ซึ่งจะแสดงข้อมูลที่แชร์ เพื่อให้ผู้ใช้มีข้อมูลในการตัดสินใจว่าจะใช้ข้อมูลรับรองใด

  2. การเลือกของผู้ใช้และการโต้ตอบกับ Wallet: ผู้ใช้เลือกข้อมูลเข้าสู่ระบบ แล้ว Android จะเรียกใช้แอป Wallet ที่เกี่ยวข้องเพื่อทำธุรกรรมให้เสร็จสมบูรณ์ แอป Wallet อาจแสดงหน้าจอแสดงความยินยอมของตนเองหรือกำหนดให้ต้องมีการยืนยันข้อมูลไบโอเมตริก

ผลลัพธ์: หากผู้ใช้ให้ความยินยอม ระบบจะแชร์ข้อมูลเข้าสู่ระบบเพื่อระบุตัวตนที่เลือกกับแอปพลิเคชันที่ขอ หากผู้ใช้ปฏิเสธ ระบบจะแสดงข้อผิดพลาด

ในแอป

หากต้องการขอข้อมูลเข้าสู่ระบบเพื่อระบุตัวตนจากแอป Android ให้ทำตามขั้นตอนต่อไปนี้

อัปเดตทรัพยากร Dependency

ใน build.gradle ของโปรเจ็กต์ ให้อัปเดต Dependency เพื่อใช้ Credential Manager (เบต้า) โดยทำดังนี้

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

กำหนดค่าเครื่องมือจัดการข้อมูลเข้าสู่ระบบ

หากต้องการกําหนดค่าและเริ่มต้นออบเจ็กต์ 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, ...)

ผู้เรียกแอปจะให้พารามิเตอร์ IdentityRequest ทั้งหมดเป็นสตริง JSON ที่นี่จะแสดงเป็นพารามิเตอร์ requestMatcher ของ CredentialOption เครื่องมือจัดการข้อมูลเข้าสู่ระบบจะไม่สนใจเนื้อหาของ 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="
}

การตอบกลับจะแสดง identityToken (สตริง JSON) ที่กำหนดโดย W3C แอป Wallet มีหน้าที่สร้างคำตอบนี้

ตัวอย่าง

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

ส่งโทเค็นและประมวลผลบนเซิร์ฟเวอร์

เมื่อได้รับ identityToken แล้ว แอปพลิเคชันควรส่ง identityToken ดังกล่าวไปยังเซิร์ฟเวอร์แอปพลิเคชันเพื่อรับการยืนยัน ขั้นตอนแรกคือการถอดรหัสโทเค็นจากรูปแบบ Base64 ไบต์อาร์เรย์ผลลัพธ์จะแสดงข้อมูล CBOR ซึ่งเป็นไปตาม CDDL ต่อไปนี้

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

ขั้นตอนถัดไปคือการคำนวณ SessionTranscript จาก ISO/IEC 18013-5:2021 ด้วยโครงสร้างการส่งต่อสำหรับ Android โดยเฉพาะ ดังนี้

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

cleartext ที่ได้คือไบต์ DeviceResponse CBOR ตามที่กำหนดไว้ใน ISO/IEC 18013-5:2021 DeviceResponse ต้องได้รับการตรวจสอบตาม ISO/IEC 18013-5:2021 ข้อ 9 ซึ่งประกอบด้วยหลายขั้นตอน เช่น การยืนยันว่า mdoc มาจากผู้ออกใบรับรองที่เชื่อถือได้ และการตอบกลับได้รับการลงนามโดยอุปกรณ์ที่ต้องการ คุณสามารถใช้คลาส DeviceResponseParser จากโปรเจ็กต์ข้อมูลเข้าสู่ระบบเพื่อระบุตัวตนของ OpenWallet Foundation เป็นส่วนหนึ่งของกระบวนการตรวจสอบนี้

เว็บ

หากต้องการขอข้อมูลเข้าสู่ระบบเพื่อระบุตัวตนโดยใช้ Digital Credentials API ใน Chrome คุณจะต้องลงชื่อสมัครใช้ช่วงทดลองใช้จากต้นทางของ Digital Credentials API

ถ่ายทอดอารมณ์ส่วนตัว

การยอมรับบัตรประจำตัวจาก Google Wallet จะต้องดำเนินการตามขั้นตอนต่อไปนี้

  • สร้างหรือซื้อเครื่องอ่านเพื่อรับบัตรประจำตัวตามที่ระบุไว้ใน ISO 18013-5
  • โหลดใบรับรอง IACA ลงในเครื่องอ่านเพื่อให้มั่นใจว่าบัตรที่ยอมรับเป็นของจริง
  • ทดสอบโซลูชัน
  • ลงทะเบียนแอปพลิเคชันกับ Google Wallet

สร้างหรือซื้อเครื่องอ่านเพื่อรับบัตรประจำตัวตามที่ระบุไว้ใน ISO 18013-5

บัตรประจำตัวใน Wallet จะใช้ตามมาตรฐาน ISO 18013-5 สำหรับใบขับขี่บนอุปกรณ์เคลื่อนที่ โดยจะใช้การมีส่วนร่วมแบบ NFC หรือคิวอาร์โค้ดร่วมกับ BLE เป็นกลไกการโอนข้อมูล ดังนั้นอุปกรณ์ใดก็ตามที่สามารถใช้มาตรฐานด้านเหล่านั้นได้ก็จะทำหน้าที่เป็นเครื่องมืออ่านได้ แม้แต่แอปพลิเคชันบนอุปกรณ์เคลื่อนที่ เนื่องจากเป็นมาตรฐานแบบเปิด จึงมีการใช้งานของบุคคลที่สามหลายรายการในตลาด นอกจากนี้ คุณยังใช้ฟังก์ชันการทำงานดังกล่าวได้โดยตรงหากต้องการ

ดูคำแนะนำเกี่ยวกับวิธีใช้ฟังก์ชันนี้ด้วยตนเองได้ที่แอป Android สำหรับอ่านข้อมูลอ้างอิงแบบโอเพนซอร์สของเรา ซึ่งใช้มาตรฐาน ISO และยอมรับ mDL จาก Google Wallet ได้

คุณเริ่มต้นได้ด้วยการสร้างและเรียกใช้แอปโปรแกรมอ่านข้อมูลอ้างอิง ดังนี้

  • โคลนที่เก็บแอปอ้างอิง
  • เปิดโปรเจ็กต์ใน Android Studio
  • บิลด์และเรียกใช้เป้าหมาย appverifier ในอุปกรณ์ Android หรือโปรแกรมจำลอง

โหลดใบรับรอง IACA ลงในเครื่องอ่านเพื่อให้มั่นใจว่าบัตรที่ยอมรับเป็นของจริง

คุณต้องระบุบัตรประจำตัวใน Wallet จากผู้ออกบัตรที่รองรับเพื่อตรวจสอบข้อมูลเข้าสู่ระบบจริง รายชื่อผู้ออกบัตรที่ Google Wallet รองรับแสดงอยู่ด้านล่างพร้อมลิงก์ไปยังใบรับรองสำหรับการยืนยัน

ทดสอบโซลูชัน

หากต้องการทดสอบโซลูชัน ให้สร้างและเรียกใช้แอปพลิเคชัน Android ซึ่งเป็นผู้ถือการอ้างอิงโอเพนซอร์สของเรา ขั้นตอนการสร้างและเรียกใช้แอปผู้ถือข้อมูลอ้างอิงมีดังนี้

  • โคลนที่เก็บแอปอ้างอิง
  • เปิดโปรเจ็กต์ใน Android Studio
  • บิลด์และเรียกใช้เป้าหมาย appholder ในอุปกรณ์ Android หรือโปรแกรมจำลอง

(ไม่บังคับ) ลงทะเบียนแอปพลิเคชันกับ Google Wallet

ลงทะเบียนแอปพลิเคชันกับ Google Wallet โดยกรอกแบบฟอร์มนี้