ตั้งแต่ Chrome 122 เป็นต้นไป Disconnect API สำหรับ Federated Credential Management API (FedCM) จะพร้อมใช้งาน Disconnect API ช่วยให้บุคคลที่สามตัดการเชื่อมต่อผู้ใช้ออกจากบัญชีของผู้ให้บริการข้อมูลประจำตัวได้โดยไม่ต้องอาศัยคุกกี้ของบุคคลที่สาม นอกจากนี้ เรายังได้อัปเดตการจัดการ SameSite ของ FedCM 2 รายการ
ยกเลิกการเชื่อมต่อ API
เมื่อผู้ใช้สร้างบัญชีในฝ่ายที่เชื่อถือ (RP - เว็บไซต์ที่ใช้ผู้ให้บริการข้อมูลประจำตัวเพื่อตรวจสอบสิทธิ์) ผ่านการรวมข้อมูลประจำตัว ผู้ให้บริการข้อมูลประจำตัว (IdP - บริการที่ให้การตรวจสอบสิทธิ์และข้อมูลบัญชีแก่บุคคลอื่น) มักจะบันทึกการเชื่อมต่อในเซิร์ฟเวอร์ของตน การเชื่อมต่อที่จัดเก็บไว้ช่วยให้ IdP ติดตาม RP ที่ผู้ใช้ลงชื่อเข้าใช้และเพิ่มประสิทธิภาพประสบการณ์ของผู้ใช้ ตัวอย่างเช่น เพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีขึ้นเมื่อกลับมาที่ RP ในภายหลัง ระบบจะถือว่าบัญชีผู้ใช้ที่มี IdP เป็นบัญชีที่กลับมา ซึ่งจะเปิดใช้ฟีเจอร์ต่างๆ เช่น การตรวจสอบสิทธิ์อีกครั้งโดยอัตโนมัติและปุ่มที่ปรับเปลี่ยนในแบบของคุณซึ่งแสดงบัญชีที่ใช้
บางครั้งผู้ให้บริการระบุตัวตนอาจมี API เพื่อยกเลิกการเชื่อมต่อบัญชีจาก RP อย่างไรก็ตาม ขั้นตอนการยกเลิกการเชื่อมต่อจะได้รับการตรวจสอบสิทธิ์และต้องใช้คุกกี้ IdP ในโลกที่ไม่มีคุกกี้ของบุคคลที่สาม เมื่อผู้ใช้เข้าชม RP จะไม่มี Browser API สำหรับ RP เพื่อยกเลิกการเชื่อมต่อกับ IdP เนื่องจากอาจมีบัญชี IdP หลายบัญชีจาก IdP เดียวกันที่ลิงก์กับ RP หนึ่งๆ ขั้นตอนการยกเลิกการเชื่อมต่อจึงจำเป็นต้องทราบว่าจะยกเลิกการเชื่อมต่อบัญชีใด
Disconnect 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
หากต้องการรองรับ Disconnect API นั้น IdP ต้องรองรับปลายทางการยกเลิกการเชื่อมต่อและให้พร็อพเพอร์ตี้ 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 ควรทําดังนี้
- ตอบสนองคําขอด้วย CORS (Cross-Origin Resource Sharing)
- ยืนยันว่าคำขอมีส่วนหัว
Sec-Fetch-Dest: webidentity
HTTP - จับคู่ส่วนหัว
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
อย่างไรก็ตาม เนื่องจากไฟล์ Well-Known ต้องวางไว้ที่รูทของ eTLD+1 ของเซิร์ฟเวอร์ IdP จึงต้องอยู่ที่ idp.example/.well-known/web-identity
และเป็นเซิร์ฟเวอร์เวอร์ชันที่ใช้งานจริง เนื่องจากนักพัฒนาแอปอาจไม่สามารถวางไฟล์ในสภาพแวดล้อมเวอร์ชันที่ใช้งานจริงได้ขณะที่อยู่ระหว่างการพัฒนา จึงทําให้นักพัฒนาแอปทดสอบ FedCM ไม่ได้
ตั้งแต่ Chrome 122 เป็นต้นไป หากโดเมน RP และโดเมน IdP เหมือนกัน Chrome จะข้ามการตรวจสอบไฟล์ Well-Known วิธีนี้จะช่วยให้นักพัฒนาแอปทดสอบในสถานการณ์ดังกล่าวได้
ตอนนี้ชิ้นงานย่อยสามารถตั้งค่าสถานะการเข้าสู่ระบบในเว็บไซต์เดียวกันได้แล้ว
ก่อนหน้านี้ Chrome อนุญาตให้ตั้งค่าสถานะการเข้าสู่ระบบ (เช่น ใช้ส่วนหัว Set-Login: logged-in
) เฉพาะในกรณีที่คำขอมีต้นทางเดียวกันกับบรรพบุรุษทั้งหมดเท่านั้น ซึ่งป้องกันไม่ให้มีการเข้าสู่ระบบผ่านคำขอในเว็บไซต์เดียวกัน
fetch()
ที่กำหนดสถานะการเข้าสู่ระบบ
ตัวอย่างเช่น ลองนึกถึงเว็บไซต์ที่อนุญาตให้ผู้ใช้ป้อนชื่อผู้ใช้และรหัสผ่านใน idp.example
แต่ระบบจะโพสต์ข้อมูลเข้าสู่ระบบไปยัง login.idp.example
ด้วย fetch()
บันทึกสถานะการเข้าสู่ระบบไปยังเบราว์เซอร์โดยใช้ Login Status API ไม่ได้ เนื่องจากโดเมน 2 โดเมนนี้มาจากต้นทางต่างกันและอยู่ในเว็บไซต์เดียวกัน
การเปลี่ยนแปลงนี้ทำให้ข้อกำหนดสำหรับ Login Status API ต้องเป็นเว็บไซต์เดียวกันกับบรรพบุรุษทั้งหมดนั้นผ่อนปรนลง และทำให้ตัวอย่างข้างต้นสามารถตั้งค่าสถานะการเข้าสู่ระบบของ login.idp.example
โดยใช้ส่วนหัว HTTP (Set-Login:
logged-in
) ได้
สรุป
เมื่อใช้ Disconnect API แล้ว ตอนนี้ FedCM จะยกเลิกการเชื่อมต่อ RP จาก IdP ได้โดยไม่ต้องอาศัยคุกกี้ของบุคคลที่สาม โดยโทรไปที่ IdentityCredential.disconnect()
ใน RP เมื่อใช้ฟังก์ชันนี้เบราว์เซอร์จะส่งคำขอไปยังปลายทางการยกเลิกการเชื่อมต่อของ IdP เพื่อให้ IdP สิ้นสุดการเชื่อมต่อในเซิร์ฟเวอร์ จากนั้นจึงสิ้นสุดการเชื่อมต่อในเบราว์เซอร์
เราได้ประกาศว่าระบบจะข้ามการตรวจสอบ /.well-known/web-identity
เมื่อ RP และ IdP อยู่ในเว็บไซต์เดียวกันเพื่อวัตถุประสงค์ในการทดสอบ นอกจากนี้ ตอนนี้คุณยังตั้งค่าสถานะการเข้าสู่ระบบผ่านส่วนหัวการตอบกลับ HTTP จากทรัพยากรย่อยของ IdP ในเว็บไซต์เดียวกันได้แล้ว