เผยแพร่: 12 พฤศจิกายน 2024, อัปเดตล่าสุด: 29 พฤศจิกายน 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 ฝ่ายที่เกี่ยวข้องจะ ส่งสัญญาณรายการข้อมูลเข้าสู่ระบบที่มีอยู่และข้อมูลเมตาของข้อมูลเข้าสู่ระบบเหล่านั้น เพื่อให้ พาสคีย์ในผู้ให้บริการพาสคีย์ซิงค์อยู่เสมอ
ดูข้อมูลเพิ่มเติมเกี่ยวกับพาสคีย์ได้ที่การเข้าสู่ระบบแบบไม่มีรหัสผ่านด้วยพาสคีย์