คู่มือนี้จะให้คำแนะนำที่เน้นการดำเนินการอย่างละเอียดสำหรับการใช้การตรวจสอบสิทธิ์ด้วยพาสคีย์และการจัดการข้อมูลเข้าสู่ระบบที่ปลอดภัยและไม่ขึ้นอยู่กับเฟรมเวิร์กในเว็บแอปพลิเคชันสมัยใหม่
1. ข้อกำหนดเบื้องต้นที่สำคัญสำหรับพาสคีย์
พาสคีย์อาศัย Web Authentication API (WebAuthn) ซึ่งกำหนดข้อจำกัดด้านความปลอดภัยแบบข้ามแพลตฟอร์มที่เข้มงวดซึ่งต้องเป็นไปตามข้อกำหนดก่อนที่จะพยายามติดตั้งใช้งาน ดังนี้
- บริบทที่ปลอดภัย: เมธอด WebAuthn (
navigator.credentials.createและnavigator.credentials.get) จะได้รับการควบคุมอย่างเข้มงวดภายใต้บริบทที่ปลอดภัย แอปพลิเคชันต้องทำงานบนhttps://ในเวอร์ชันที่ใช้งานจริง หรือhttp://localhostสำหรับการพัฒนาในเครื่อง - รหัส Relying Party (RP): ข้อมูลเข้าสู่ระบบทุกรายการจะเชื่อมโยงกับรหัส RP (โดยพื้นฐานแล้วคือชื่อโดเมนของแอปพลิเคชัน) รหัส RP ที่ส่งในตัวเลือกฝั่งเซิร์ฟเวอร์ต้องตรงกันหรือเป็นส่วนต่อท้ายที่ถูกต้องของชื่อโดเมนของต้นทางปัจจุบัน (เช่น
example.comใช้ได้กับlogin.example.com) ความไม่ตรงกันจะส่งผลให้เกิดข้อยกเว้นSecurityErrorในฝั่งไคลเอ็นต์
2. ข้อจำกัด UX ของ AAGUID
Authenticator Attestation Globally Unique Identifier (AAGUID) คือตัวระบุที่ไม่ซ้ำกัน 128 บิตที่แสดงในข้อมูลเอกสารรับรองการลงทะเบียนซึ่งแสดงถึงรุ่น/ผู้ให้บริการของ Authenticator (เช่น เครื่องมือจัดการรหัสผ่านบน Google, iCloud Keychain, 1Password)
- คำแนะนำ UX เท่านั้น: ฝ่ายที่เชื่อถือต้องใช้ AAGUID สำหรับคำแนะนำ UX เท่านั้น (เช่น การแสดงชื่อและไอคอนของผู้ให้บริการพาสคีย์ในรายการการจัดการเพื่อช่วยเหลือผู้ใช้)
- ไม่มีการพึ่งพาด้านความปลอดภัย: แอปพลิเคชันต้องไม่ใช้ AAGUID เพื่อการรักษาความปลอดภัยด้วยวิทยาการเข้ารหัสหรือการตัดสินใจในการเข้าถึง ปัจจุบันพาสคีย์ของแพลตฟอร์มไม่มีการรับรองการเข้ารหัสสำหรับ AAGUID ซึ่งหมายความว่า User Agent สามารถแก้ไขหรือจำลองได้
3. คำแนะนำเกี่ยวกับคลังที่แยกออกมา
สำหรับการสร้างตัวเลือก FIDO2/WebAuthn แบ็กเอนด์และการยืนยันลายเซ็น นักพัฒนาแอปต้องใช้ไลบรารีโอเพนซอร์สที่ผ่านการตรวจสอบแล้วตามภาษาแทนการใช้วิทยาการเข้ารหัสที่สร้างขึ้นเอง ดังนี้
- JavaScript/TypeScript: SimpleWebAuthn (github.com/MasterKale/SimpleWebAuthn)
- Python: py_webauthn (github.com/duo-labs/py_webauthn)
- Java: Java WebAuthn Server (github.com/Yubico/java-webauthn-server), WebAuthn4J (github.com/webauthn4j/webauthn4j)
- .NET: ไลบรารี .NET สำหรับ FIDO2 (github.com/abergs/fido2-net-lib)
- Go: WebAuthn Go Library (github.com/go-webauthn/webauthn)
- Ruby: WebAuthn Ruby (github.com/cedarcode/webauthn-ruby)
- PHP: WebAuthn Framework (github.com/web-auth/webauthn-framework)
4. เมทริกซ์อ้างอิงกรณีการใช้งาน
ระบุกรณีการใช้งานที่ตรงกันด้านล่างและดูคู่มือการติดตั้งใช้งานฉบับเต็ม กรณีการใช้งานทุกกรณีมี API ที่สำคัญ (PublicKeyCredential.parseCreationOptionsFromJSON, parseRequestOptionsFromJSON, signalAllAcceptedCredentials, signalCurrentUserDetails, signalUnknownCredential, สื่อกลางแบบมีเงื่อนไข, การจัดการ AAGUID ฯลฯ) ซึ่งระบุไว้ในคู่มือเฉพาะกรณีการใช้งานเท่านั้น อย่าข้ามขั้นตอนการดึงข้อมูลนี้ และอย่าใช้ Wrapper ของไลบรารีของบุคคลที่สาม (เช่น startAuthentication/startRegistration ของ SimpleWebAuthn) แทนในฝั่งไคลเอ็นต์ ให้เรียกใช้ WebAuthn Browser API แบบเนทีฟโดยตรง คำแนะนำเกี่ยวกับไลบรารีในส่วนที่ 3 มีผลกับฝั่งเซิร์ฟเวอร์ (การยืนยัน FIDO2 แบ็กเอนด์) เท่านั้น
รายละเอียดการติดตั้งใช้งานพาสคีย์และ WebAuthn ที่เฉพาะเจาะจงจะแมปกับคำแนะนำต่อไปนี้
- การลงทะเบียนพาสคีย์: การลงทะเบียนพาสคีย์ - เสนอการลงทะเบียนพาสคีย์และโปรโมชันใหม่
- การสร้างพาสคีย์แบบมีเงื่อนไข: การสร้างพาสคีย์แบบมีเงื่อนไข (การโปรโมตหลังการเข้าสู่ระบบ) - การลงทะเบียนพาสคีย์โดยไม่มีการแจ้งเตือนทันทีหลังจากเข้าสู่ระบบด้วยรหัสผ่านสำเร็จ
- การตรวจสอบสิทธิ์ด้วยพาสคีย์: การตรวจสอบสิทธิ์ด้วยพาสคีย์ - การลงชื่อเข้าใช้ด้วยปุ่มและการป้อนข้อความอัตโนมัติที่ค้นพบได้
- การลงชื่อเข้าใช้อย่างรวดเร็ว: การลงชื่อเข้าใช้อย่างรวดเร็วด้วยโหมด UI ทันที - การลงชื่อเข้าใช้ตามบริบทในหน้าเว็บด้วยพาสคีย์ในเครื่องและรหัสผ่านที่บันทึกไว้ก่อนการนำทางหน้าเว็บ
- การจัดการพาสคีย์: การจัดการพาสคีย์ - การซิงค์รายการ การเปลี่ยนชื่อ และการลบด้วยเครื่องมือจัดการรหัสผ่าน
- การตรวจสอบสิทธิ์ซ้ำด้วยพาสคีย์: การตรวจสอบสิทธิ์ซ้ำด้วยพาสคีย์ - ยืนยันผู้ใช้ที่ลงชื่อเข้าใช้อีกครั้งสำหรับขั้นตอนที่มีความละเอียดอ่อน