ใน Chrome 122 จะมี ยกเลิกการลิงก์ API สำหรับ Federated Credential Management API (FedCM) ไว้ Connected API จะอนุญาตให้บุคคลที่พึ่งยกเลิกการเชื่อมต่อผู้ใช้จากบัญชีของผู้ให้บริการข้อมูลประจำตัวได้โดยไม่ต้องอาศัยคุกกี้ของบุคคลที่สาม นอกจากนี้ยังมีการอัปเดตอีก 2-3 ข้อเกี่ยวกับการจัดการเว็บไซต์เดียวกันของ FedCM
ยกเลิกการเชื่อมต่อ API
เมื่อผู้ใช้สร้างบัญชีในฝ่ายที่เชื่อถือ (RP - เว็บไซต์ที่ใช้ผู้ให้บริการข้อมูลประจำตัวเพื่อตรวจสอบสิทธิ์) ผ่านการรวมข้อมูลประจำตัว ผู้ให้บริการข้อมูลประจำตัว (IdP - บริการที่ให้การตรวจสอบสิทธิ์และข้อมูลบัญชีแก่บุคคลอื่น) มักจะบันทึกการเชื่อมต่อในเซิร์ฟเวอร์ของตน การเชื่อมต่อที่จัดเก็บไว้ช่วยให้ IdP ติดตาม RP ที่ผู้ใช้ลงชื่อเข้าใช้และเพิ่มประสิทธิภาพประสบการณ์การใช้งานได้ ตัวอย่างเช่น เพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีขึ้นเมื่อกลับมาที่ RP ในภายหลัง ระบบจะถือว่าบัญชีผู้ใช้ที่มี IdP เป็นบัญชีที่กลับมา ซึ่งจะเปิดใช้ฟีเจอร์ต่างๆ เช่น การตรวจสอบสิทธิ์อีกครั้งโดยอัตโนมัติและปุ่มที่ปรับเปลี่ยนในแบบของคุณซึ่งแสดงบัญชีที่ใช้
บางครั้งผู้ให้บริการระบุตัวตนอาจมี API เพื่อยกเลิกการเชื่อมต่อบัญชีจาก RP อย่างไรก็ตาม ขั้นตอนการยกเลิกการเชื่อมต่อจะได้รับการตรวจสอบสิทธิ์และต้องใช้คุกกี้ IdP ในโลกที่ไม่มีคุกกี้ของบุคคลที่สาม เมื่อผู้ใช้เข้าชม RP จะไม่มี Browser 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 (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 จะข้ามการตรวจสอบไฟล์ที่รู้จักกันดี วิธีนี้จะช่วยให้นักพัฒนาซอฟต์แวร์ ทดสอบในสถานการณ์ดังกล่าวได้
ตอนนี้ชิ้นงานย่อยสามารถตั้งค่าสถานะการเข้าสู่ระบบในเว็บไซต์เดียวกันได้แล้ว
ก่อนหน้านี้ 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 ในเว็บไซต์เดียวกันได้แล้ว