ตั้งแต่ 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 ควรทำดังนี้
- ตอบกลับคำขอด้วย CORS (กลไกการแชร์ทรัพยากรข้ามโดเมน)
- ตรวจสอบว่าคำขอมีส่วนหัว HTTP ของ
Sec-Fetch-Dest: webidentity
- จับคู่ส่วนหัว
Origin
กับต้นทาง RP ที่client_id
กำหนด ให้ปฏิเสธหากข้อมูลไม่ตรงกัน - ค้นหาบัญชีที่ตรงกับ
account_hint
- ยกเลิกการเชื่อมต่อบัญชีผู้ใช้จากรายการบัญชีที่เชื่อมโยงกันของ RP
- ตอบกลับเบราว์เซอร์ด้วย
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 เว็บไซต์เดียวกันก็เป็นไปได้