spinny:~/writing $ less passkeys-webauthn-passwordless-authentication.md
12รหัสผ่านเป็นหนึ่งในสิ่งที่เราทำให้เป็นมาตรฐานเพียงเพราะเราใช้ชีวิตร่วมกับมันมานานหลายปี ผู้ใช้จะลืม ใช้ซ้ำ เขียนในที่ที่ไม่ควร ทีมจะต้องจัดการการรีเซ็ต นโยบาย แฮช การรั่วไหล ฟิชชิ่ง และการสนับสนุน34passkey ไม่ได้ทำให้การรับรองความถูกต้องสมบูรณ์แบบ แต่ช่วยขจัดปัญหาใหญ่ได้: เซิร์ฟเวอร์ไม่จำเป็นต้องเก็บความลับที่แชร์กับผู้ใช้อีกต่อไป56## เกิดอะไรขึ้นจริงๆ78A passkey เป็นข้อมูลรับรองตาม WebAuthn เมื่อผู้ใช้สร้างขึ้น อุปกรณ์จะสร้างคู่คีย์:910- รหัสส่วนตัวซึ่งยังคงอยู่ในอุปกรณ์หรือในตัวจัดการรหัสผ่าน11- รหัสสาธารณะซึ่งเซิร์ฟเวอร์สามารถบันทึกได้1213เมื่อเข้าสู่ระบบเซิร์ฟเวอร์ไม่ถาม "บอกรหัสผ่าน" ส่งความท้าทายแบบสุ่ม อุปกรณ์ลงนามด้วยรหัสส่วนตัว เซิร์ฟเวอร์ตรวจสอบลายเซ็นด้วยรหัสสาธารณะ1415นั่นเป็นส่วนที่ดี: หากฐานข้อมูลถูกขโมย จะไม่มีรหัสผ่านภายในให้ถอดรหัส และหากผู้ใช้ลงเอยด้วยโดเมนปลอม passkey จะไม่ถูกต้องสำหรับโดเมนนั้น ไม่ใช่แค่ความสะดวกสบายเท่านั้น แต่ยังเป็นการป้องกันฟิชชิ่งอย่างเป็นรูปธรรมอีกด้วย1617## เบราว์เซอร์ทำหน้าที่เป็นสะพานเชื่อม1819ในเบราว์เซอร์ API หลักสองตัวคือ:2021- `navigator.credentials.create()` เพื่อสร้าง passkey;22- `navigator.credentials.get()` เพื่อใช้ระหว่างเข้าสู่ระบบ2324แต่ตรรกะที่สำคัญอยู่ที่เซิร์ฟเวอร์ เซิร์ฟเวอร์จะต้องสร้างความท้าทาย บันทึกชั่วคราว ตรวจสอบการตอบสนอง ตรวจสอบแหล่งที่มาและ Relying Party ID จากนั้นจึงสร้างเซสชัน2526ส่วนของไคลเอนต์ควรจะน่าเบื่อเกือบ:2728```typescript29const options = await fetch('/api/passkeys/login/options').then((r) => r.json());3031const credential = await navigator.credentials.get({32 publicKey: PublicKeyCredential.parseRequestOptionsFromJSON(options),33});3435await fetch('/api/passkeys/login/verify', {36 method: 'POST',37 headers: { 'Content-Type': 'application/json' },38 body: JSON.stringify(credential?.toJSON()),39});40```4142หากคุณพบว่าตัวเองใช้การเข้ารหัส WebAuthn ด้วยตนเอง ให้หยุด ใช้ไลบรารีฝั่งเซิร์ฟเวอร์ที่มีประสิทธิภาพ ข้อผิดพลาดที่นี่ไม่ใช่ "ข้อบกพร่องที่น่ารัก" แต่เป็นช่องโหว่ในการตรวจสอบสิทธิ์4344## สิ่งที่ต้องบันทึกในฐานข้อมูล4546ไม่จำเป็นต้องกอบกู้โลกครึ่งโลก มักจะเพียงพอ:4748- ID ของหนังสือรับรอง;49- กุญแจสาธารณะ50- ผู้ใช้ที่เชื่อมต่อ;51- ตัวนับการยืนยันหรือข้อมูลเมตาใด ๆ52- การขนส่ง หากมีประโยชน์สำหรับ UX53- ชื่อที่ผู้ใช้เลือก;54- วันที่สร้างและการใช้งานครั้งล่าสุด5556ตารางขั้นต่ำอาจมีลักษณะดังนี้:5758```sql59create table passkey_credentials (60 id uuid primary key default gen_random_uuid(),61 user_id uuid not null references users(id),62 credential_id text not null unique,63 public_key text not null,64 name text,65 created_at timestamptz not null default now(),66 last_used_at timestamptz67);68```6970จากนั้น ฉันจะเพิ่มบันทึกการตรวจสอบและการแจ้งเตือน หากมีคนสร้าง passkey ใหม่บนบัญชีของฉัน ฉันก็อยากจะทราบเรื่องนี้7172## UX มีความสำคัญมากกว่าการสาธิต7374การสาธิตของ passkey นั้นสวยงามเสมอ: คุณคลิก Face ID คุณก็เข้ามาแล้ว ผลิตภัณฑ์จริงมีความซับซ้อนมากขึ้น7576มีคนเปลี่ยนโทรศัพท์ มีคนใช้คอมพิวเตอร์ของบริษัทที่ถูกล็อค บางคนไม่เข้าใจว่าทำไมเบราว์เซอร์ถึงแนะนำ passkey มีคนสูญเสียการเข้าถึงอุปกรณ์ของตน7778นี่คือเหตุผลที่ฉันจะไม่เริ่มด้วย "ตั้งแต่วันนี้ ไม่มีรหัสผ่านสำหรับทุกคนอีกต่อไป" ฉันจะเริ่มต้นเช่นนี้:79801. passkey ตัวเลือกสำหรับผู้ใช้ภายใน812. คำแนะนำในการสร้างหนึ่งรายการหลังจากเข้าสู่ระบบสำเร็จ823. หน้าบัญชีที่จะเปลี่ยนชื่อและลบ passkey;834. ทางเลือกที่ชัดเจน845. การเปิดตัวแบบค่อยเป็นค่อยไปในการเข้าสู่ระบบหลัก8586ข้อความในอินเทอร์เฟซควรเรียบง่าย "ใช้หน้าจอล็อคอุปกรณ์ของคุณ" ดีกว่า "ตรวจสอบสิทธิ์ด้วยข้อมูลประจำตัวผู้อยู่อาศัย FIDO2"8788## ข้อผิดพลาดที่ฉันจะหลีกเลี่ยง8990อย่าสร้างความท้าทายให้กับลูกค้า ความท้าทายถูกสร้างขึ้นบนเซิร์ฟเวอร์และต้องได้รับการตรวจสอบเพียงครั้งเดียว9192อย่าเพิ่งเชื่อถือรหัสประจำตัว คุณต้องยืนยันลายเซ็น ความท้าทาย ต้นกำเนิด และ Relying Party ID9394อย่าลบทางเลือกก่อนที่คุณจะมีขั้นตอนการกู้คืนที่ดี การใช้รหัสผ่านไม่จำเป็นต้องกลายเป็น "ถ้าคุณทำโทรศัพท์หาย คุณจะออกไปข้างนอกตลอดไป"9596อย่าถือว่า passkey เป็นเพียงปุ่มส่วนหน้าเท่านั้น การซ่อนปุ่มไม่ใช่การรักษาความปลอดภัย การตรวจสอบที่แท้จริงคือฝั่งเซิร์ฟเวอร์9798## Passkey-แรกหรือ passkey-เป็นมิตร?99100สำหรับผลิตภัณฑ์ใหม่ ให้คิด passkey-ก่อน สำหรับแอปที่มีอยู่แล้ว ฉันชอบที่เป็นมิตรกับ passkey: เพิ่ม passkey เป็นวิธีการที่แนะนำ วัดความสำเร็จและปัญหา จากนั้นลดน้ำหนักรหัสผ่านอย่างใจเย็น101102ไม่รู้สึกถึงการโยกย้ายในอุดมคติ ผู้ใช้ค้นพบว่าการเข้าสู่ระบบนั้นง่ายกว่า ไม่ใช่ว่าบริษัทได้เปลี่ยนโปรโตคอลการตรวจสอบความถูกต้อง103104## บทสรุป105106passkey มีความน่าสนใจเนื่องจากปรับปรุงความปลอดภัยและ UX ในเวลาเดียวกัน ซึ่งหาได้ยาก พวกมันไม่ใช่ไม้กายสิทธิ์: การกู้คืน ความเข้ากันได้ การสนับสนุน และการเปิดตัวยังคงต้องได้รับการออกแบบอย่างดี107108แต่การเปลี่ยนแปลงพื้นฐานนั้นแข็งแกร่ง หยุดขอให้ผู้ใช้ประดิษฐ์และปกป้องความลับ คุณอนุญาตให้อุปกรณ์ลงนามหลักฐานการเข้ารหัสที่เชื่อมโยงกับโดเมนของคุณ หน่วยความจำของมนุษย์น้อยลง ฟิชชิ่งน้อยลง การรีเซ็ตรหัสผ่านน้อยลง ฉันว่าพวกเขาก็คุ้มค่าที่จะจริงจัง109110## แหล่งที่มา111112- [MDN: Passkeys](https://developer.mozilla.org/en-US/docs/Web/Security/Authentication/Passkeys)113- [MDN: Web Authentication API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API)114- [W3C: Web Authentication](https://www.w3.org/TR/webauthn-3/)115- [passkeys.dev](https://passkeys.dev/)116
:Passkey และ WebAuthn: เข้าสู่ระบบโดยไม่ต้องใช้รหัสผ่าน โดยไม่ต้องใช้เวทย์มนตร์lines 1-116 (END) — press q to close