Thông tin cập nhật của FedCM: Ngắt kết nối API và 2 bản cập nhật

Từ Chrome 122, bạn có thể sử dụng API ngắt kết nối cho API quản lý thông tin xác thực liên kết (FedCM). API ngắt kết nối cho phép các bên đáng tin cậy ngắt kết nối người dùng của họ khỏi tài khoản của nhà cung cấp danh tính mà không cần dựa vào cookie của bên thứ ba. Ngoài ra, chúng tôi cũng có một vài điểm cập nhật về cách xử lý trên cùng trang web của FedCM.

Ngắt kết nối API

Khi người dùng tạo tài khoản trên một bên tin cậy (RP – trang web sử dụng nhà cung cấp danh tính để xác thực) thông qua liên kết danh tính, nhà cung cấp danh tính (IdP – dịch vụ cung cấp thông tin xác thực và thông tin tài khoản cho các bên khác) thường ghi lại kết nối trên máy chủ của mình. Kết nối đã lưu trữ cho phép IdP theo dõi các RP mà người dùng đã đăng nhập và tối ưu hoá trải nghiệm của họ. Ví dụ: để có trải nghiệm tốt hơn khi người dùng sau này quay lại RP, tài khoản người dùng có IdP được coi là tài khoản trả lại, cho phép các tính năng như tự động xác thực lại và các nút được cá nhân hoá hiển thị tài khoản đã sử dụng.

Đôi khi, IdP cung cấp API để ngắt kết nối tài khoản khỏi RP. Tuy nhiên, một luồng ngắt kết nối được xác thực và cần có cookie của IdP. Trong một môi trường không có cookie của bên thứ ba, khi người dùng truy cập RP, không có API trình duyệt nào để RP ngắt kết nối khỏi IdP. Vì có thể có nhiều tài khoản IdP từ cùng một IdP được liên kết với một RP nhất định, nên quy trình ngắt kết nối yêu cầu phải biết tài khoản nào đang bị ngắt kết nối.

API Ngắt kết nối cho phép người dùng ngắt kết nối tài khoản IdP khỏi RP trên trình duyệt cũng như trên máy chủ IdP bằng cách báo hiệu tài khoản đó đến điểm cuối đã chỉ định. Người dùng cần phải trải qua liên kết danh tính bằng cách sử dụng API quản lý thông tin xác thực liên kết (FedCM). Sau khi bị ngắt kết nối, người dùng đó sẽ được coi là người dùng mới vào lần tiếp theo họ cố gắng đăng nhập vào RP bằng IdP.

Ngắt kết nối IdP khỏi RP

Nếu người dùng trước đây đã đăng nhập vào RP bằng IdP thông qua FedCM, thì mối quan hệ sẽ được trình duyệt ghi nhớ cục bộ dưới dạng danh sách các tài khoản đã kết nối. RP có thể bắt đầu ngắt kết nối bằng cách gọi hàm IdentityCredential.disconnect(). Hàm này có thể được gọi từ khung RP cấp cao nhất. RP cần truyền configURL, clientId mà ứng dụng này sử dụng trong IdP và accountHint để ngắt kết nối IdP. Gợi ý về tài khoản có thể là một chuỗi tuỳ ý miễn là điểm cuối ngắt kết nối có thể xác định tài khoản (ví dụ: địa chỉ email hoặc mã nhận dạng người dùng không nhất thiết phải khớp với mã tài khoản mà điểm cuối trong danh sách tài khoản đã cung cấp):

// 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() trả về một Promise. Lời hứa này có thể gửi một trường hợp ngoại lệ vì những lý do sau:

  • Người dùng chưa đăng nhập vào RP bằng IdP thông qua FedCM.
  • API được gọi từ bên trong iframe mà không có chính sách về quyền của FedCM.
  • configURL không hợp lệ hoặc thiếu điểm cuối ngắt kết nối.
  • Không kiểm tra được Chính sách bảo mật nội dung (CSP).
  • Có một yêu cầu ngắt kết nối đang chờ xử lý.
  • Người dùng đã tắt FedCM trong phần cài đặt của trình duyệt.

Khi điểm cuối ngắt kết nối của IdP trả về một phản hồi, RP và IdP sẽ bị ngắt kết nối trên trình duyệt và lời hứa sẽ được giải quyết. Tài khoản người dùng bị ngắt kết nối được chỉ định trong phản hồi từ điểm cuối ngắt kết nối.

Thiết lập tệp cấu hình IdP

Để hỗ trợ API Ngắt kết nối, IdP phải hỗ trợ điểm cuối ngắt kết nối và cung cấp thuộc tính disconnect_endpoint cũng như đường dẫn của thuộc tính đó trong tệp cấu hình IdP.

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

Ngắt kết nối tài khoản trên điểm cuối ngắt kết nối

Bằng cách gọi IdentityCredential.disconnect(), trình duyệt sẽ gửi yêu cầu POST trên nhiều nguồn gốc có cookie và loại nội dung application/x-www-form-urlencoded đến điểm cuối ngắt kết nối này với thông tin sau:

Tài sản Nội dung mô tả
account_hint Gợi ý về tài khoản IdP.
client_id Mã nhận dạng khách hàng của bên bị hạn chế.
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

Khi nhận được yêu cầu, máy chủ IdP cần:

  1. Phản hồi yêu cầu bằng tính năng CORS (Chia sẻ tài nguyên trên nhiều nguồn gốc).
  2. Xác minh rằng yêu cầu chứa tiêu đề HTTP Sec-Fetch-Dest: webidentity.
  3. So khớp tiêu đề Origin với nguồn gốc RP do client_id xác định. Từ chối nếu các chi tiết đó không khớp.
  4. Tìm tài khoản phù hợp với account_hint.
  5. Ngắt kết nối tài khoản người dùng khỏi danh sách tài khoản đã kết nối của bên bị hạn chế.
  6. Phản hồi trình duyệt bằng account_id của người dùng đã được xác định ở định dạng JSON.

Ví dụ về tải trọng JSON phản hồi có dạng như sau:

{
  "account_id": "account456"
}

Nếu IdP muốn trình duyệt ngắt kết nối mọi tài khoản liên kết với RP đó, hãy chuyển một chuỗi không khớp với bất kỳ mã tài khoản nào, ví dụ: "*".

Giờ đây, việc kiểm tra /.well-known/web-identity sẽ bị bỏ qua khi RP và IdP ở cùng một trang web

Khi phát triển một hệ thống FedCM, việc kiểm thử hoặc thử nghiệm các miền máy chủ RP có thể là miền con của máy chủ IdP sản xuất. Ví dụ: máy chủ IdP bản phát hành chính thức nằm tại idp.example, và cả máy chủ RP thử nghiệm và máy chủ IdP thử nghiệm đều nằm tại staging.idp.example. Tuy nhiên, vì tệp phổ biến phải được đặt ở gốc eTLD+1 của máy chủ IdP, nên tệp này phải nằm tại idp.example/.well-known/web-identity và là máy chủ sản xuất. Vì các nhà phát triển không nhất thiết có thể đặt tệp vào môi trường sản xuất khi đang phát triển, nên điều này sẽ ngăn họ kiểm thử FedCM.

Kể từ Chrome 122, nếu miền RP và miền IdP giống nhau, thì Chrome sẽ bỏ qua bước kiểm tra tệp phổ biến. Bằng cách này, nhà phát triển sẽ có thể kiểm thử trong trường hợp như vậy.

Các tài nguyên phụ hiện có thể đặt trạng thái đăng nhập trên cùng một trang web

Trước đây, Chrome chỉ cho phép đặt trạng thái đăng nhập (ví dụ: sử dụng tiêu đề Set-Login: logged-in) khi yêu cầu có cùng nguồn gốc với tất cả đối tượng cấp trên. Việc này ngăn chặn hoạt động đăng nhập thông qua các yêu cầu fetch() cùng trang web đặt trạng thái đăng nhập.

Ví dụ: hãy nghĩ về một trang web cho phép người dùng nhập tên người dùng và mật khẩu của họ trên idp.example, nhưng thông tin đăng nhập lại được đăng lên login.idp.example bằng fetch(). Bạn không thể ghi lại trạng thái đăng nhập vào trình duyệt bằng API trạng thái đăng nhập vì hai miền này có nhiều nguồn gốc và cùng trang web.

Với thay đổi này, chúng tôi đã nới lỏng yêu cầu API trạng thái đăng nhập cùng trang web với tất cả đối tượng cấp trên và giúp ví dụ trên có thể đặt trạng thái đăng nhập của login.idp.example bằng tiêu đề HTTP (Set-Login: logged-in).

Tóm tắt

Bằng cách sử dụng API Ngắt kết nối, FedCM hiện có thể ngắt kết nối RP khỏi IdP mà không cần dựa vào cookie của bên thứ ba. Để thực hiện việc này, hãy gọi IdentityCredential.disconnect() trên RP. Với hàm này, trình duyệt sẽ gửi yêu cầu đến điểm cuối ngắt kết nối của IdP để IdP có thể chấm dứt kết nối trên máy chủ rồi trên trình duyệt.

Chúng tôi đã thông báo rằng quy trình kiểm tra /.well-known/web-identity sẽ bị bỏ qua khi RP và IdP ở cùng một trang web cho mục đích kiểm thử. Ngoài ra, giờ đây, bạn có thể đặt trạng thái đăng nhập thông qua tiêu đề phản hồi HTTP từ cùng một tài nguyên con IdP trên cùng trang web.