ข้อมูลอัปเดตจาก FedCM: ยกเลิกการเชื่อมต่อ API และการอัปเดต 2 รายการ

ตั้งแต่ Chrome 122 เป็นต้นไป ยกเลิกการเชื่อมต่อ API สำหรับ Federated Credential Management API (FedCM) พร้อมให้บริการ การเชื่อมต่อ API ช่วยให้ผู้ที่พึ่งพาผู้อื่นยกเลิกการเชื่อมต่อบัญชีของผู้ให้บริการข้อมูลประจำตัวได้โดยไม่ต้องอาศัยคุกกี้ของบุคคลที่สาม นอกจากนี้ยังมีการอัปเดต 2-3 รายการเกี่ยวกับการจัดการในเว็บไซต์เดียวกันของ FedCM

ยกเลิกการเชื่อมต่อ API

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

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

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

ยกเลิกการเชื่อมต่อ IdP จาก RP

หากผู้ใช้เคยลงชื่อเข้าใช้ RP โดยใช้ IdP ผ่าน FedCM เบราว์เซอร์จะจดจำความสัมพันธ์ดังกล่าวไว้ในเครื่องเป็นรายการบัญชีที่เชื่อมโยงกัน RP อาจเริ่มยกเลิกการเชื่อมต่อโดยเรียกใช้ฟังก์ชัน IdentityCredential.disconnect() สามารถเรียกฟังก์ชันนี้จากเฟรม RP ระดับบนสุด โดย RP จะต้องผ่าน configURL, clientId ที่ใช้ภายใต้ IdP และ accountHint เพื่อให้ยกเลิกการเชื่อมต่อ IdP คำแนะนำบัญชีสามารถเป็นสตริงที่กำหนดเองได้ตราบใดที่ปลายทางการยกเลิกการเชื่อมต่อสามารถระบุบัญชีได้ เช่น อีเมลหรือรหัสผู้ใช้ ซึ่งไม่จำเป็นต้องตรงกับรหัสบัญชีที่ปลายทางรายการบัญชีระบุไว้

// Disconnect an IdP account "account456" from the RP "https://idp.com/". This is invoked on the RP domain.
IdentityCredential.disconnect({
  configURL: "https://idp.com/config.json",
  clientId: "rp123",
  accountHint: "account456"
});

IdentityCredential.disconnect() แสดงผล Promise สัญญานี้อาจมีข้อยกเว้น เนื่องจากสาเหตุต่อไปนี้

  • ผู้ใช้ไม่ได้ลงชื่อเข้าใช้ RP โดยใช้ IdP ผ่าน FedCM
  • มีการเรียกใช้ API จากภายใน iframe โดยไม่มีนโยบายสิทธิ์ของ FedCM
  • configURL ไม่ถูกต้องหรือไม่มีปลายทางการยกเลิกการเชื่อมต่อ
  • การตรวจสอบนโยบายรักษาความปลอดภัยเนื้อหา (CSP) ไม่สำเร็จ
  • มีคำขอยกเลิกการเชื่อมต่อที่รอดำเนินการ
  • ผู้ใช้ปิดใช้ FedCM ในการตั้งค่าเบราว์เซอร์

เมื่อปลายทางการยกเลิกการเชื่อมต่อของ IdP แสดงผลการตอบกลับ RP และ IdP จะเลิกเชื่อมต่อในเบราว์เซอร์และคำมั่นสัญญาจะได้รับการแก้ไข บัญชีผู้ใช้ที่ตัดการเชื่อมต่อจะระบุอยู่ในการตอบสนองจากปลายทางการยกเลิกการเชื่อมต่อ

ตั้งค่าไฟล์การกำหนดค่า IdP

และ IdP จะต้องรองรับปลายทางการยกเลิกการเชื่อมต่อและระบุพร็อพเพอร์ตี้ disconnect_endpoint และเส้นทางในไฟล์การกำหนดค่า IdP เพื่อให้รองรับ ภายใต้การเชื่อมต่อ API

{
  "accounts_endpoint": "/accounts",
  "id_assertion_endpoint": "/assertion",
  ...
  "disconnect_endpoint: "/disconnect"
}

ยกเลิกการเชื่อมต่อบัญชีบนปลายทางการยกเลิกการเชื่อมต่อ

เมื่อเรียกใช้ IdentityCredential.disconnect() เบราว์เซอร์จะส่งคำขอ POST แบบข้ามต้นทางที่มีคุกกี้และประเภทเนื้อหา application/x-www-form-urlencoded ไปยังปลายทางการยกเลิกการเชื่อมต่อนี้พร้อมข้อมูลต่อไปนี้

พร็อพเพอร์ตี้ คำอธิบาย
account_hint คำแนะนำสำหรับบัญชี IdP
client_id ตัวระบุลูกค้าของ RP
POST /disconnect HTTP/1.1
Host: idp.example
Origin: rp.example
Content-Type: application/x-www-form-urlencoded
Cookie: 0x123
Sec-Fetch-Dest: webidentity

account_hint=account456&client_id=rp123

เมื่อได้รับคำขอ เซิร์ฟเวอร์ IdP ควรทำดังนี้

  1. ตอบกลับคำขอด้วย CORS (กลไกการแชร์ทรัพยากรข้ามโดเมน)
  2. ตรวจสอบว่าคำขอมีส่วนหัว HTTP ของ Sec-Fetch-Dest: webidentity
  3. จับคู่ส่วนหัว Origin กับต้นทาง RP ที่ client_id กำหนด ให้ปฏิเสธหากข้อมูลไม่ตรงกัน
  4. ค้นหาบัญชีที่ตรงกับ account_hint
  5. ยกเลิกการเชื่อมต่อบัญชีผู้ใช้จากรายการบัญชีที่เชื่อมโยงกันของ RP
  6. ตอบกลับเบราว์เซอร์ด้วย account_id ของผู้ใช้ที่ระบุในรูปแบบ JSON

ตัวอย่างเพย์โหลด JSON ของการตอบกลับจะมีลักษณะดังนี้

{
  "account_id": "account456"
}

หาก IdP ต้องการให้เบราว์เซอร์ยกเลิกการเชื่อมต่อบัญชีทั้งหมดที่เชื่อมโยงกับ RP แทน ให้ส่งสตริงที่ไม่ตรงกับรหัสบัญชีใดๆ เช่น "*"

ระบบจะข้ามการตรวจสอบ /.well-known/web-identity เมื่อ RP และ IdP อยู่ในเว็บไซต์เดียวกัน

เมื่อพัฒนาระบบ FedCM โดเมนเซิร์ฟเวอร์ RP ที่ใช้การทดสอบหรือทดลองใช้อาจเป็นโดเมนย่อยของเซิร์ฟเวอร์ IdP เวอร์ชันที่ใช้งานจริง เช่น เซิร์ฟเวอร์ IdP เวอร์ชันที่ใช้งานจริงจะอยู่ที่ idp.example และทั้งเซิร์ฟเวอร์ RP สำหรับทดลองใช้และเซิร์ฟเวอร์ IdP เวอร์ชันทดลองใช้จะอยู่ที่ staging.idp.example อย่างไรก็ตาม เนื่องจากไฟล์ซึ่งเป็นที่รู้จักจะต้องวางไว้ที่รูทของ eTLD+1 ของเซิร์ฟเวอร์ IdP ไฟล์ดังกล่าวจึงต้องอยู่ที่ idp.example/.well-known/web-identity และเป็นเซิร์ฟเวอร์ที่ใช้งานจริง เนื่องจากนักพัฒนาซอฟต์แวร์ไม่ได้วางไฟล์ในสภาพแวดล้อมการใช้งานจริงระหว่างการพัฒนา นักพัฒนาซอฟต์แวร์จึงทดสอบ FedCM ไม่ได้

ตั้งแต่ Chrome 122 เป็นต้นไป หากโดเมน RP และโดเมน IdP เหมือนกัน Chrome จะข้ามการตรวจสอบไฟล์ที่รู้จัก วิธีนี้จะช่วยให้นักพัฒนาแอปสามารถ ทดสอบในสถานการณ์ดังกล่าว

ตอนนี้ทรัพยากรย่อยตั้งสถานะการเข้าสู่ระบบเว็บไซต์เดียวกันได้แล้ว

ก่อนหน้านี้ Chrome จะอนุญาตเฉพาะการตั้งค่าสถานะการเข้าสู่ระบบ (เช่น ใช้ส่วนหัว Set-Login: logged-in) เมื่อคำขอเป็นต้นทางเดียวกันกับระดับบนทั้งหมด การดำเนินการนี้จะป้องกันไม่ให้เข้าสู่ระบบผ่านคำขอเว็บไซต์เดียวกัน fetch() ที่ตั้งค่าสถานะการเข้าสู่ระบบ

ตัวอย่างเช่น ลองนึกถึงเว็บไซต์ที่อนุญาตให้ผู้ใช้ป้อนชื่อผู้ใช้และรหัสผ่านใน idp.example แต่ข้อมูลเข้าสู่ระบบจะโพสต์ไปยัง login.idp.example ด้วย fetch() บันทึกสถานะการเข้าสู่ระบบไปยังเบราว์เซอร์โดยใช้ API สถานะการเข้าสู่ระบบไม่ได้ เนื่องจากทั้ง 2 โดเมนเป็นแบบข้ามต้นทางและในเว็บไซต์เดียวกัน

จากการเปลี่ยนแปลงนี้ เราได้ผ่อนปรนข้อกำหนดของ API สถานะการเข้าสู่ระบบให้เป็นเว็บไซต์เดียวกันกับระดับบนทั้งหมด และทำให้ตัวอย่างข้างต้นกำหนดสถานะการเข้าสู่ระบบของ login.idp.example ได้โดยใช้ส่วนหัว HTTP (Set-Login: logged-in)

สรุป

การใช้ CONNECT API ทำให้ FedCM ยกเลิกการเชื่อมต่อ RP จาก IdP ได้โดยไม่ต้องอาศัยคุกกี้ของบุคคลที่สาม วิธีการคือให้โทรหา IdentityCredential.disconnect() บน RP เมื่อใช้ฟังก์ชันนี้ เบราว์เซอร์จะส่งคำขอไปยังปลายทางการยกเลิกการเชื่อมต่อของ IdP เพื่อให้ IdP สามารถสิ้นสุดการเชื่อมต่อบนเซิร์ฟเวอร์ แล้วต่อจากเบราว์เซอร์

เราได้ประกาศว่าจะข้ามการตรวจสอบ /.well-known/web-identity เมื่อ RP และ IdP เป็นเว็บไซต์เดียวกันเพื่อจุดประสงค์ในการทดสอบ นอกจากนี้ การตั้งค่าสถานะการเข้าสู่ระบบผ่านส่วนหัวการตอบกลับ HTTP จากทรัพยากรย่อยของ IdP เว็บไซต์เดียวกันก็เป็นไปได้