เผยแพร่เมื่อวันที่ 12 พฤศจิกายน 2024
WebAuthn Signal API ช่วยให้ผู้อ้างอิงส่งสัญญาณข้อมูลเข้าสู่ระบบที่มีอยู่ไปยังผู้ให้บริการพาสคีย์ที่เชื่อมต่อ การดำเนินการนี้จะช่วยให้ผู้ให้บริการพาสคีย์ที่รองรับสามารถอัปเดตหรือนำพาสคีย์ที่ไม่ถูกต้องหรือถูกเพิกถอนออกจากพื้นที่เก็บข้อมูลของตนเพื่อไม่ให้แสดงต่อผู้ใช้อีกต่อไป
ความเข้ากันได้
Chrome บนเดสก์ท็อปรองรับ Signal API ตั้งแต่ Chrome เวอร์ชัน 132 เป็นต้นไป เครื่องมือจัดการรหัสผ่านบน Google จะอัปเดตพาสคีย์ให้สอดคล้องกับสัญญาณได้ สำหรับผู้ให้บริการพาสคีย์ที่อิงตามส่วนขยาย Chrome ผู้ให้บริการจะแสดงสัญญาณหรือไม่นั้นขึ้นอยู่กับผู้ให้บริการเอง
เราจะรองรับ Chrome ใน Android ในภายหลัง
Safari รองรับแต่ยังไม่ได้ติดตั้งใช้งาน Firefox ยังไม่ได้แชร์ความคิดเห็น
ข้อมูลเบื้องต้น
เมื่อสร้างพาสคีย์ (ข้อมูลเข้าสู่ระบบที่ค้นพบได้) ระบบจะบันทึกข้อมูลเมตา เช่น ชื่อผู้ใช้และชื่อที่แสดง ไปยังผู้ให้บริการพาสคีย์ (เช่น เครื่องมือจัดการรหัสผ่าน) พร้อมกับคีย์ส่วนตัว ส่วนข้อมูลเข้าสู่ระบบคีย์สาธารณะจะบันทึกไว้ในเซิร์ฟเวอร์ของฝ่ายที่เชื่อถือ (RP) การเก็บชื่อผู้ใช้และชื่อที่แสดงจะช่วยให้ผู้ใช้ระบุพาสคีย์ที่เสนอให้ลงชื่อเข้าใช้ได้เมื่อได้รับข้อความแจ้ง ซึ่งจะเป็นประโยชน์อย่างยิ่งเมื่อผู้ใช้มีพาสคีย์มากกว่า 2 รายการจากผู้ให้บริการพาสคีย์รายต่างๆ
อย่างไรก็ตาม มี 2 กรณีที่ความไม่สอดคล้องกันระหว่างรายการพาสคีย์ของผู้ให้บริการกับรายการข้อมูลเข้าสู่ระบบของเซิร์ฟเวอร์อาจทำให้เกิดความสับสน
กรณีแรกคือเมื่อผู้ใช้ลบข้อมูลเข้าสู่ระบบในเซิร์ฟเวอร์โดยไม่ได้แตะต้องพาสคีย์ในผู้ให้บริการพาสคีย์ เมื่อผู้ใช้พยายามลงชื่อเข้าใช้ด้วยพาสคีย์ในครั้งถัดไป ผู้ให้บริการพาสคีย์จะยังคงแสดงพาสคีย์นั้นต่อผู้ใช้ อย่างไรก็ตาม การพยายามลงชื่อเข้าใช้จะดำเนินการไม่สำเร็จเนื่องจากเซิร์ฟเวอร์จะยืนยันด้วยคีย์สาธารณะที่ถูกลบไปแล้วไม่ได้
กรณีที่ 2 คือเมื่อผู้ใช้อัปเดตชื่อผู้ใช้หรือชื่อที่แสดงในเซิร์ฟเวอร์ เมื่อผู้ใช้พยายามลงชื่อเข้าใช้ครั้งถัดไป พาสคีย์ในผู้ให้บริการพาสคีย์จะยังคงแสดงชื่อผู้ใช้และชื่อที่แสดงเดิม แม้ว่าจะมีการอัปเดตในเซิร์ฟเวอร์แล้วก็ตาม โดยควรซิงค์กัน
Signal API
Signal API เป็น WebAuthn API ที่จะช่วยคลายความสับสนเหล่านี้ด้วยการอนุญาตให้ RP ส่งสัญญาณการเปลี่ยนแปลงไปยังผู้ให้บริการพาสคีย์ โดยทำได้ 3 วิธีดังนี้
PublicKeyCredential.signalUnknownCredential
: บ่งบอกว่าไม่มีข้อมูลเข้าสู่ระบบPublicKeyCredential.signalAllAcceptedCredentials
: ส่งสัญญาณรายการข้อมูลเข้าสู่ระบบที่บันทึกไว้PublicKeyCredential.signalCurrentUserDetails
: Signal อัปเดตชื่อผู้ใช้และ/หรือชื่อที่แสดงแล้ว
สัญญาณว่าไม่มีข้อมูลเข้าสู่ระบบ
const credential = await navigator.credentials.get({ ... });
const payload = credential.toJSON();
const result = await fetch('/login', { ... });
// Detect authentication failure due to lack of the credential
if (result.status === 404) {
// Feature detection
if (PublicKeyCredential.signalUnknownCredential) {
await PublicKeyCredential.signalUnknownCredential({
rpId: "example.com",
credentialId: "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA" // base64url encoded credential ID
});
} else {
// Encourage the user to delete the passkey from the password manager nevertheless.
...
}
}
การเรียกใช้ PublicKeyCredential.signalUnknownCredential()
ด้วยรหัส RP และรหัสข้อมูลเข้าสู่ระบบจะช่วยให้ RP แจ้งผู้ให้บริการพาสคีย์ได้ว่าข้อมูลเข้าสู่ระบบที่ระบุถูกนำออกแล้วหรือไม่มีอยู่จริง ผู้ให้บริการพาสคีย์จะจัดการกับสัญญาณนี้อย่างไรก็ได้ แต่คาดว่าระบบจะนำพาสคีย์ที่เชื่อมโยงออกเพื่อไม่ให้ผู้ใช้ลงชื่อเข้าใช้ด้วยพาสคีย์ เนื่องจากไม่มีข้อมูลเข้าสู่ระบบที่เชื่อมโยง
คุณเรียกใช้ API นี้ได้เมื่อการลงชื่อเข้าใช้ด้วยพาสคีย์ไม่สำเร็จเนื่องจากไม่มีข้อมูลเข้าสู่ระบบ วิธีนี้ช่วยให้ RP สามารถป้องกันไม่ให้ผู้ใช้พยายามลงชื่อเข้าใช้ด้วยพาสคีย์ที่ไม่มีข้อมูลเข้าสู่ระบบที่เชื่อมโยง ซึ่งแตกต่างจาก signalAllAcceptedCredentials
เนื่องจากไม่จำเป็นต้องส่งรายการรหัสข้อมูลเข้าสู่ระบบทั้งหมด จึงควรใช้เมื่อผู้ใช้ไม่ได้ผ่านการตรวจสอบสิทธิ์เพื่อหลีกเลี่ยงการเปิดเผยจำนวนพาสคีย์ของผู้ใช้รายนั้น
แสดงรายการข้อมูลเข้าสู่ระบบที่บันทึกไว้
// After a user deletes a passkey or a user is signed in.
// Feature detection
if (PublicKeyCredential.signalAllAcceptedCredentials) {
await PublicKeyCredential.signalAllAcceptedCredentials({
rpId: "example.com",
userId: "M2YPl-KGnA8", // base64url encoded user ID
allAcceptedCredentialIds: [ // A list of base64url encoded credential IDs
"vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA",
...
]
});
}
การเรียกใช้ PublicKeyCredential.signalAllAcceptedCredentials()
ด้วยรหัส RP, รหัสผู้ใช้ และรายการรหัสข้อมูลเข้าสู่ระบบของข้อมูลเข้าสู่ระบบที่จัดเก็บไว้จะช่วยให้ RP แจ้งผู้ให้บริการพาสคีย์เกี่ยวกับข้อมูลเข้าสู่ระบบที่เหลืออยู่ในพื้นที่เก็บข้อมูลได้ ผู้ให้บริการพาสคีย์จะจัดการกับสัญญาณนี้อย่างไรก็ได้ แต่ระบบจะนําพาสคีย์ที่ไม่ตรงกับรายการนี้ออกเพื่อให้ผู้ใช้ไม่เห็นพาสคีย์ในการลงชื่อเข้าใช้ที่ไม่มีข้อมูลเข้าสู่ระบบที่เชื่อมโยงอยู่
คุณควรเรียกใช้ API นี้เมื่อผู้ใช้ลบพาสคีย์ใน RP และการลงชื่อเข้าใช้ทุกครั้ง เพื่อให้ผู้ให้บริการพาสคีย์ซิงค์รายการพาสคีย์ได้
อัปเดตชื่อผู้ใช้และชื่อที่แสดงของ Signal
// After a user updated their username and/or display name
// or a user is signed in.
// Feature detection
if (PublicKeyCredential.signalCurrentUserDetails) {
await PublicKeyCredential.signalCurrentUserDetails({
rpId: "example.com",
userId: "M2YPl-KGnA8", // base64url encoded user ID
name: "a.new.email.address@example.com", // username
displayName: "J. Doe"
});
} else {
}
การเรียกใช้ PublicKeyCredential.signalCurrentUserDetails()
ด้วยรหัส RP, รหัสผู้ใช้, ชื่อผู้ใช้ และชื่อที่แสดงจะช่วยให้ RP แจ้งข้อมูลผู้ใช้ที่อัปเดตแล้วให้แก่ผู้ให้บริการพาสคีย์ได้ ผู้ให้บริการพาสคีย์จะจัดการกับสัญญาณนี้อย่างไรก็ได้ แต่คาดว่าพาสคีย์ที่ผู้ใช้เป็นเจ้าของจะได้รับการอัปเดตด้วยข้อมูลผู้ใช้ใหม่
API นี้สามารถเรียกใช้เมื่อมีการอัปเดตชื่อผู้ใช้หรือชื่อที่แสดงของผู้ใช้ และทุกครั้งที่ลงชื่อเข้าใช้ เพื่อให้ผู้ให้บริการพาสคีย์ซิงค์ข้อมูลนี้กับเซิร์ฟเวอร์อยู่เสมอ
สรุป
Signal API ช่วยให้คุณสร้างประสบการณ์การใช้งานพาสคีย์ที่ดียิ่งขึ้นด้วยการลดโอกาสที่การลงชื่อเข้าใช้จะล้มเหลวโดยไม่คาดคิด เมื่อใช้ Signal API ผู้อ้างอิงสามารถส่งสัญญาณรายการข้อมูลเข้าสู่ระบบที่มีอยู่และข้อมูลเมตาของข้อมูลเข้าสู่ระบบดังกล่าว เพื่อให้ข้อมูลพาสคีย์ในผู้ให้บริการพาสคีย์ซิงค์กันอยู่เสมอ
หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับพาสคีย์ ให้เริ่มต้นจากการเข้าสู่ระบบแบบไม่ต้องใช้รหัสผ่านด้วยพาสคีย์