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

เผยแพร่เมื่อวันที่ 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 วิธีดังนี้

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

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

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

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

สรุป

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

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