ตรวจสอบว่าพาสคีย์สอดคล้องกับข้อมูลเข้าสู่ระบบในเซิร์ฟเวอร์ด้วย Signal API

เผยแพร่: 12 พฤศจิกายน 2024, อัปเดตล่าสุด: 29 พฤศจิกายน 2024

WebAuthn Signal API ช่วยให้ผู้ให้บริการที่เชื่อถือได้ส่งสัญญาณข้อมูลเข้าสู่ระบบที่มีอยู่ไปยังผู้ให้บริการพาสคีย์ที่เชื่อมต่อ ซึ่งจะช่วยให้ผู้ให้บริการพาสคีย์ที่รองรับสามารถอัปเดตหรือนำพาสคีย์ที่ไม่ถูกต้องหรือถูกเพิกถอนออกจากที่เก็บข้อมูล เพื่อไม่ให้ระบบแสดงพาสคีย์ดังกล่าวแก่ผู้ใช้อีกต่อไป

ความเข้ากันได้

Chrome รองรับ Signal API ในแพลตฟอร์มเดสก์ท็อปและ Android ทั้งหมด

Safari รองรับ แต่ยังไม่ได้ใช้งาน Firefox ยังไม่ได้แสดง ความคิดเห็น

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

ฉากหลัง

เมื่อสร้างพาสคีย์ (ข้อมูลเข้าสู่ระบบที่ค้นพบได้) ระบบจะบันทึกข้อมูลเมตา เช่น ชื่อผู้ใช้และชื่อที่แสดง ไว้ในผู้ให้บริการพาสคีย์ (เช่น เครื่องมือจัดการรหัสผ่าน) พร้อมกับคีย์ส่วนตัว ส่วนข้อมูลเข้าสู่ระบบคีย์สาธารณะจะบันทึกไว้ในเซิร์ฟเวอร์ของบุคคลที่สาม (RP) การบันทึก ชื่อผู้ใช้และชื่อที่แสดงจะช่วยให้ผู้ใช้ระบุพาสคีย์ที่เสนอเพื่อใช้ในการ ลงชื่อเข้าใช้เมื่อได้รับแจ้ง ซึ่งจะมีประโยชน์อย่างยิ่งเมื่อผู้ใช้มีพาสคีย์มากกว่า 2 รายการจากผู้ให้บริการพาสคีย์ที่แตกต่างกัน

อย่างไรก็ตาม มีบางกรณีที่ความไม่สอดคล้องกันระหว่างรายการพาสคีย์ของผู้ให้บริการ กับรายการข้อมูลเข้าสู่ระบบของเซิร์ฟเวอร์อาจทำให้เกิดความสับสน

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

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

Signal API

Signal API เป็น WebAuthn API ที่แก้ไขความไม่สอดคล้องเหล่านี้โดย อนุญาตให้ RP ส่งสัญญาณการเปลี่ยนแปลงไปยังผู้ให้บริการพาสคีย์ โดยมี 3 วิธีดังนี้

ส่งสัญญาณว่าไม่มีข้อมูลเข้าสู่ระบบ

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 แจ้งผู้ให้บริการพาสคีย์ได้ว่าระบบได้นำข้อมูลเข้าสู่ระบบที่ระบุออกแล้วหรือไม่มีข้อมูลเข้าสู่ระบบดังกล่าว ผู้ให้บริการพาสคีย์จะเป็นผู้กำหนดวิธีจัดการสัญญาณนี้ แต่ควรนำพาสคีย์ที่เชื่อมโยงออกเพื่อให้ผู้ใช้ไม่ต้องพยายามลงชื่อเข้าใช้ ด้วยพาสคีย์ที่ไม่มีข้อมูลเข้าสู่ระบบที่เชื่อมโยง

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

เรียกใช้ API นี้ได้เมื่อการลงชื่อเข้าใช้ด้วยพาสคีย์ล้มเหลวเนื่องจากไม่มีข้อมูลเข้าสู่ระบบ วิธีนี้จะช่วยให้ RP ป้องกันไม่ให้ผู้ใช้พยายามลงชื่อเข้าใช้ด้วยพาสคีย์ที่ไม่มีข้อมูลเข้าสู่ระบบที่เชื่อมโยง ซึ่งต่างจาก signalAllAcceptedCredentials วิธีนี้ไม่จำเป็นต้องส่งรายการรหัสข้อมูลเข้าสู่ระบบทั้งหมด ดังนั้นให้ใช้วิธีนี้ทุกครั้งที่ผู้ใช้ไม่ได้รับการตรวจสอบสิทธิ์เพื่อหลีกเลี่ยง การเปิดเผยจำนวนพาสคีย์สำหรับผู้ใช้ที่เฉพาะเจาะจง

กล่องโต้ตอบที่แสดงเมื่อลบพาสคีย์ออกจากเครื่องมือจัดการรหัสผ่านบน Google ใน Chrome
กล่องโต้ตอบที่แสดงเมื่อลบพาสคีย์จากเครื่องมือจัดการรหัสผ่านบน Google ใน Chrome

ส่งสัญญาณรายการข้อมูลเข้าสู่ระบบที่บันทึกไว้

// 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() หลังจากที่ผู้ใช้ลงชื่อเข้าใช้ หรือจัดการการตั้งค่าบัญชี คุณระบุรายการรหัสข้อมูลเข้าสู่ระบบที่ถูกต้องทั้งหมดสำหรับผู้ใช้รายนั้น ผู้ให้บริการพาสคีย์จะเปรียบเทียบรายการนี้กับที่เก็บข้อมูลในเครื่อง สำหรับบุคคลที่สามที่เชื่อถือได้รายนั้น ผู้ให้บริการพาสคีย์จะทำเครื่องหมายพาสคีย์ที่พบในที่เก็บข้อมูลซึ่งไม่ได้รวมอยู่ในรายการ allAcceptedCredentialIds ว่า "ซ่อน" ระบบจะไม่แสดงพาสคีย์ที่ซ่อนไว้เหล่านี้สำหรับการลงชื่อเข้าใช้หรือการป้อนข้อความอัตโนมัติอีกต่อไป แต่ระบบจะไม่ลบพาสคีย์อย่างถาวรในทันที ซึ่งจะช่วยให้สามารถกู้คืนได้หากจำเป็น ในทางกลับกัน ผู้ให้บริการพาสคีย์จะกู้คืนพาสคีย์ที่มีอยู่ใน allAcceptedCredentialIds ซึ่งทำเครื่องหมายเป็น "ซ่อน" ซึ่งจะช่วยให้เว็บไซต์กู้คืนพาสคีย์ที่ซ่อนไว้โดยไม่ได้ตั้งใจได้

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

เรียกใช้ 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 แจ้งข้อมูลผู้ใช้ที่อัปเดตให้ผู้ให้บริการพาสคีย์ทราบได้ ผู้ให้บริการพาสคีย์จะเป็นผู้กำหนดวิธีจัดการสัญญาณนี้ แต่ควรจะอัปเดตพาสคีย์ที่ผู้ใช้เป็นเจ้าของด้วยข้อมูลผู้ใช้ใหม่

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

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

กล่องโต้ตอบที่แสดงเมื่อมีการอัปเดตข้อมูลเมตาของพาสคีย์ในเครื่องมือจัดการรหัสผ่านบน Google ใน Chrome
กล่องโต้ตอบที่แสดงเมื่อมีการอัปเดตข้อมูลเมตาของพาสคีย์ในเครื่องมือจัดการรหัสผ่านบน Google ใน Chrome

สรุป

Signal API ช่วยให้คุณสร้างประสบการณ์การใช้งานพาสคีย์ที่ดีขึ้นได้ด้วยการขจัด การลงชื่อเข้าใช้ที่ไม่สำเร็จโดยไม่คาดคิด Signal API ช่วยให้ผู้ให้บริการที่ต้องพึ่งพาอาศัยกันสามารถส่งสัญญาณรายการข้อมูลเข้าสู่ระบบที่มีอยู่และข้อมูลเมตาของข้อมูลเข้าสู่ระบบเหล่านั้น เพื่อให้ซิงค์พาสคีย์ในผู้ให้บริการพาสคีย์ได้

ดูข้อมูลเพิ่มเติมเกี่ยวกับพาสคีย์ได้ที่การเข้าสู่ระบบแบบไม่มีรหัสผ่านด้วยพาสคีย์