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

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

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

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

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

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

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

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

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

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

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

สรุป

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

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