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 Ngắt kết nối API 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, có một số nội dung cập nhật về cách xử lý trên cùng một trang web của FedCM.

API ngắt kết nối

Khi người dùng tạo tài khoản thông qua 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, trình cung cấp danh tính (IdP – dịch vụ cung cấp thông tin xác thực và 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 họ. 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 quay lại RP sau này, tài khoản người dùng có IdP được coi là tài khoản cũ, cho phép các tính năng như tự động xác thực lại và nút được cá nhân hoá cho thấy tài khoản đã sử dụng.

Đôi khi, các IdP cung cấp một API để ngắt kết nối tài khoản đó khỏi một bên bị hạn chế. Tuy nhiên, quy trình ngắt kết nối được xác thực và yêu cầu có cookie của IdP. Trong một thế giới không có cookie của bên thứ ba, khi người dùng truy cập vào RP, RP sẽ không có API trình duyệt để ngắt kết nối vớ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 cần 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 cho tài khoản IdP đến điểm cuối đã chỉ định. Người dùng cần phải trải qua quy trình 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 đã đăng nhập vào RP bằng IdP thông qua FedCM, thì trình duyệt sẽ ghi nhớ mối quan hệ này 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(). Bạn có thể gọi hàm này từ khung RP cấp cao nhất. RP cần truyền configURL, clientId mà nó sử dụng trong IdP và accountHint để ngắt kết nối IdP. Gợi ý 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ã nhận dạng tài khoản mà điểm cuối 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ề Promise. Lời hứa này có thể gửi một 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ừ trong một iframe không có chính sách về quyền 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 phân giải. Các tài khoản người dùng đang 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 (nhà cung cấp danh tính)

Để hỗ trợ API Ngắt kết nối, IdP phải hỗ trợ một điểm cuối ngắt kết nối, đồng thời 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 một yêu cầu POST trên nhiều nguồn gốc bằng 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:

Thuộc tính Mô tả
account_hint Gợi ý cho tài khoản IdP.
client_id Giá trị nhận dạng ứng dụng khách của 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

Sau khi nhận được yêu cầu, máy chủ của IdP phải:

  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 không khớp.
  4. Tìm tài khoản khớp với account_hint.
  5. Huỷ kết nối tài khoản người dùng khỏi danh sách tài khoản được 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 đã xác định ở định dạng JSON.

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

{
  "account_id": "account456"
}

Nếu IdP muốn trình duyệt ngắt kết nối tất cả tài khoản được liên kết với RP, hãy truyề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, bạn sẽ bỏ qua bước kiểm tra /.well-known/web-identity khi RP và IdP nằm trên 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 chính thức. Ví dụ: máy chủ IdP chính thức nằm ở idp.example và cả máy chủ RP thử nghiệm và máy chủ IdP thử nghiệm đều nằm ở staging.idp.example. Tuy nhiên, vì tệp well-known phải được đặt ở thư mục gốc của eTLD+1 của máy chủ IdP, nên tệp này phải nằm ở idp.example/.well-known/web-identity và là máy chủ phát hành chính thức. Vì nhà phát triển không nhất thiết phải đặt tệp trong môi trường phát hành chính thức trong khi đang phát triển, nên điều này khiến họ không thể kiểm thử FedCM.

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

Giờ đây, tài nguyên phụ 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 là cùng nguồn gốc với tất cả các thành phần cấp trên. Điều này đã ngăn việc đăng nhập thông qua các yêu cầu fetch() trên cùng một trang web thiết lập trạng thái đăng nhập.

Ví dụ: hãy nghĩ đến một trang web cho phép người dùng nhập tên người dùng và mật khẩu trên idp.example, nhưng thông tin xác thực được đăng lên login.idp.example bằng fetch(). 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 là trên nhiều nguồn gốc và trên cùng một trang web.

Với thay đổi này, chúng tôi đã nới lỏng yêu cầu đối với API Trạng thái đăng nhập phải là cùng trang web với tất cả các thành phần cấp trên và cho phép ví dụ trên thiết lập 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 chức năng 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ủ và sau đó 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 nằm trên cùng một trang web, nhằm mục đích kiểm thử. Ngoài ra, hiện bạn có thể đặt trạng thái đăng nhập thông qua tiêu đề phản hồi HTTP từ tài nguyên phụ của IdP cùng trang web.