Thông tin cập nhật của FedCM: API trạng thái đăng nhập, API lỗi và API cờ được chọn tự động

Chrome 120 đang vận chuyển API trạng thái đăng nhập cho FedCM. API trạng thái đăng nhập (trước đây gọi là API trạng thái đăng nhập IdP) cho phép các trang web, đặc biệt là nhà cung cấp danh tính, báo hiệu cho trình duyệt khi người dùng của họ đăng nhập và đăng xuất. Tín hiệu này được FedCM sử dụng để giải quyết vấn đề tấn công theo thời gian im lặng, và bằng cách đó, cho phép FedCM hoạt động mà không cần cookie của bên thứ ba. Bản cập nhật này giải quyết các thay đổi gần đây nhất không có khả năng tương thích ngược mà chúng tôi đã xác định trước đây trong Ý định ban đầu để gửi của FedCM, thuộc phạm vi công việc của chúng tôi.

Mặc dù API trạng thái đăng nhập cải thiện thuộc tính quyền riêng tư và khả năng hữu dụng, nhưng đây là một thay đổi không tương thích ngược sau khi được vận chuyển. Nếu bạn hiện đã triển khai FedCM, hãy nhớ cập nhật FedCM bằng các hướng dẫn sau.

Ngoài ra, Chrome cũng sẽ cung cấp 2 tính năng mới của Quản lý thông tin xác thực liên kết (FedCM):

  • API Lỗi: Thông báo cho người dùng khi lần họ đăng nhập không thành công bằng giao diện người dùng gốc dựa trên phản hồi của máy chủ từ điểm cuối xác nhận mã nhận dạng, nếu có.
  • API Cờ tự động chọn: Thông báo cho trình cung cấp danh tính (IdP) và bên phụ thuộc (RP) nếu thông tin đăng nhập được tự động chọn trong quy trình.

API trạng thái đăng nhập

API trạng thái đăng nhập là một cơ chế trong đó trang web, đặc biệt là IdP, thông báo cho trình duyệt về trạng thái đăng nhập của người dùng trên IdP. Với API này, trình duyệt có thể giảm các yêu cầu không cần thiết đến IdP và giảm thiểu các cuộc tấn công có thể xảy ra theo thời gian.

Thông báo cho trình duyệt về trạng thái đăng nhập của người dùng

IdP có thể báo hiệu trạng thái đăng nhập của người dùng đến trình duyệt bằng cách gửi tiêu đề HTTP hoặc bằng cách gọi API JavaScript khi người dùng đăng nhập trên IdP hoặc khi người dùng đã đăng xuất khỏi tất cả các tài khoản IdP của họ. Đối với mỗi IdP (được xác định bằng URL cấu hình), trình duyệt sẽ lưu giữ một biến ba trạng thái biểu thị trạng thái đăng nhập với các giá trị có thể là logged-in, logged-outunknown. Trạng thái mặc định là unknown.

Để báo hiệu rằng người dùng đã đăng nhập, hãy gửi tiêu đề HTTP Set-Login: logged-in trong một thanh điều hướng cấp cao nhất hoặc yêu cầu tài nguyên phụ có cùng nguồn gốc:

Set-Login: logged-in

Ngoài ra, hãy gọi API JavaScript navigator.login.setStatus('logged-in') từ nguồn gốc IdP:

navigator.login.setStatus('logged-in');

Các lệnh gọi này ghi lại trạng thái đăng nhập của người dùng là logged-in. Khi trạng thái đăng nhập của người dùng được đặt thành logged-in, FedCM gọi RP sẽ gửi yêu cầu đến điểm cuối danh sách tài khoản của IdP và hiển thị các tài khoản có sẵn cho người dùng trong hộp thoại FedCM.

Để báo hiệu rằng người dùng đã đăng xuất khỏi tất cả các tài khoản của họ, hãy gửi tiêu đề HTTP Set-Login: logged-out trong một thanh điều hướng cấp cao nhất hoặc một yêu cầu tài nguyên phụ có cùng nguồn gốc:

Set-Login: logged-out

Ngoài ra, hãy gọi API JavaScript navigator.login.setStatus('logged-out') từ nguồn gốc IdP:

navigator.login.setStatus('logged-out');

Các lệnh gọi này ghi lại trạng thái đăng nhập của người dùng là logged-out. Khi trạng thái đăng nhập của người dùng là logged-out, quá trình gọi FedCM sẽ tự động không thành công mà không yêu cầu đến điểm cuối trong danh sách tài khoản của IdP.

Trạng thái unknown được đặt trước khi IdP gửi tín hiệu qua API trạng thái đăng nhập. Chúng tôi ra mắt trạng thái này để chuyển đổi tốt hơn, vì người dùng có thể đã đăng nhập vào IdP khi chúng tôi gửi API này. IdP có thể không có cơ hội báo hiệu điều này cho trình duyệt vào thời điểm FedCM được gọi lần đầu tiên. Trong trường hợp này, chúng tôi sẽ gửi yêu cầu đến điểm cuối danh sách tài khoản của IdP và cập nhật trạng thái dựa trên phản hồi từ điểm cuối của danh sách tài khoản:

  • Nếu điểm cuối trả về danh sách tài khoản đang hoạt động, hãy cập nhật trạng thái thành logged-in và mở hộp thoại FedCM để hiển thị các tài khoản đó.
  • Nếu điểm cuối không trả về tài khoản nào, hãy cập nhật trạng thái thành logged-out và không thực hiện được lệnh gọi FedCM.

Nếu phiên người dùng hết hạn thì sao? Cho phép người dùng đăng nhập thông qua luồng đăng nhập động!

Mặc dù IdP liên tục thông báo trạng thái đăng nhập của người dùng vào trình duyệt, nhưng trạng thái đó có thể không đồng bộ, chẳng hạn như khi phiên hết hạn. Trình duyệt sẽ cố gắng gửi yêu cầu đã được xác thực đến điểm cuối của danh sách tài khoản khi trạng thái đăng nhập là logged-in, nhưng máy chủ không trả về tài khoản nào vì phiên không còn nữa. Trong trường hợp như vậy, trình duyệt có thể tự động cho phép người dùng đăng nhập vào IdP thông qua cửa sổ hộp thoại.

Hộp thoại FedCM hiển thị thông báo gợi ý đăng nhập, như minh hoạ trong hình sau.

Một hộp thoại FedCM đề xuất đăng nhập vào IdP.
Một hộp thoại của FedCM đề xuất đăng nhập vào IdP.

Khi người dùng nhấp vào nút Tiếp tục, trình duyệt sẽ mở ra một hộp thoại cho trang đăng nhập của IdP.

Hộp thoại ví dụ.
Hộp thoại mẫu xuất hiện sau khi nhấp vào nút đăng nhập vào nút IdP.

URL trang đăng nhập được chỉ định bằng login_url trong tệp cấu hình IdP.

{
  "accounts_endpoint": "/auth/accounts",
  "client_metadata_endpoint": "/auth/metadata",
  "id_assertion_endpoint": "/auth/idtokens",
  "login_url": "/login"
  }
}

Hộp thoại là một cửa sổ trình duyệt thông thường có cookie của bên thứ nhất. Mọi việc xảy ra trong hộp thoại đều tuỳ thuộc vào IdP và không có ô điều khiển cửa sổ nào để gửi yêu cầu giao tiếp nhiều nguồn gốc tới trang RP. Sau khi người dùng đăng nhập, IdP sẽ:

  • Gửi tiêu đề Set-Login: logged-in hoặc gọi API navigator.login.setStatus("logged-in") để thông báo cho trình duyệt rằng người dùng đã đăng nhập.
  • Gọi IdentityProvider.close() để đóng hộp thoại này.
Một người dùng đăng nhập vào một bên bị hạn chế sau khi đăng nhập vào IdP bằng FedCM.
Người dùng đăng nhập vào một bên bị hạn chế sau khi đăng nhập vào nhà cung cấp danh tính (IdP) bằng FedCM.

Bạn có thể thử hành vi của API trạng thái đăng nhập trong bản minh hoạ của chúng tôi.

  1. Nhấn vào nút Go to the IdP and sign in (Chuyển đến IdP và đăng nhập).
  2. Đăng nhập bằng tài khoản tuỳ ý.
  3. Chọn Phiên đã hết hạn trên trình đơn thả xuống Trạng thái tài khoản.
  4. Nhấn vào nút Cập nhật thông tin cá nhân.
  5. Nhấn vào nút Truy cập RP để dùng thử FedCM.

Bạn có thể quan sát đăng nhập vào IdP thông qua hành vi của mô-đun.

API Lỗi

Khi Chrome gửi yêu cầu đến điểm cuối xác nhận mã nhận dạng (ví dụ: khi người dùng nhấp vào nút Tiếp tục dưới dạng trên giao diện người dùng FedCM hoặc tính năng tự động xác thực lại được kích hoạt), IdP có thể không cấp được mã thông báo vì lý do chính đáng. Ví dụ: nếu ứng dụng không được phép, thì máy chủ tạm thời không hoạt động, v.v. Hiện tại, Chrome sẽ tự động không thực hiện yêu cầu này trong trường hợp xảy ra lỗi như vậy và chỉ thông báo cho RP bằng cách từ chối lời hứa.

Với Error API, Chrome sẽ thông báo cho người dùng bằng cách hiển thị một giao diện người dùng gốc kèm theo thông tin lỗi do IdP cung cấp.

Hộp thoại FedCM hiển thị thông báo lỗi sau khi người dùng không đăng nhập được. Chuỗi này được liên kết với loại lỗi.
Một hộp thoại của FedCM hiển thị thông báo lỗi sau khi người dùng không đăng nhập được. Chuỗi này được liên kết với loại lỗi.

API HTTP của IdP

Trong phản hồi id_assertion_endpoint, IdP có thể trả về một mã thông báo cho trình duyệt nếu có thể phát hành mã đó theo yêu cầu. Trong đề xuất này, trong trường hợp không phát hành được mã thông báo, IdP có thể trả về một phản hồi "lỗi", trong đó có hai trường mới không bắt buộc:

  1. code
  2. url
// id_assertion_endpoint response
{
  "error": {
     "code": "access_denied",
     "url": "https://idp.example/error?type=access_denied"
  }
}

Đối với mã, IdP có thể chọn một trong các lỗi đã biết trong danh sách lỗi được chỉ định cho OAuth 2.0 [invalid_request, unauthorized_client, access_denied, server_errortemporarily_unavailable] hoặc sử dụng bất kỳ chuỗi tuỳ ý nào. Nếu sau đó, Chrome sẽ hiển thị giao diện người dùng lỗi cùng với thông báo lỗi chung và chuyển mã tới RP.

Đối với url, thuộc tính này xác định một trang web mà con người có thể đọc được cùng với thông tin về lỗi để cung cấp thêm thông tin về lỗi đó cho người dùng. Trường này rất hữu ích cho người dùng vì các trình duyệt không thể cung cấp thông báo lỗi đa dạng thức trong giao diện người dùng gốc. Ví dụ: đường liên kết đến các bước tiếp theo, thông tin liên hệ của dịch vụ khách hàng, v.v. Nếu người dùng muốn tìm hiểu thêm về thông tin chi tiết về lỗi và cách khắc phục, họ có thể truy cập vào trang được cung cấp từ giao diện người dùng của trình duyệt để biết thêm chi tiết. URL này phải cùng trang web với configURL của IdP.

try {
  const cred = await navigator.credentials.get({
    identity: {
      providers: [
        {
          configURL: 'https://idp.example/manifest.json',
          clientId: '1234',
        },
      ],
    }
  });
} catch (e) {
  const code = e.code;
  const url = e.url;
}

API cờ được chọn tự động

mediation: optionalhành vi dàn xếp người dùng mặc định trong API Quản lý thông tin xác thực và hành vi này kích hoạt quá trình xác thực lại tự động khi có thể. Tuy nhiên, tính năng tự động xác thực lại có thể không dùng được vì chỉ có trình duyệt biết. Khi không có tính năng này, người dùng có thể được nhắc đăng nhập bằng tính năng dàn xếp rõ ràng cho người dùng, đây là một quy trình có các thuộc tính khác nhau.

  • Từ góc độ của phương thức gọi API, khi nhận được mã thông báo mã nhận dạng, phương thức đó sẽ không biết được đó có phải là kết quả của quy trình tự động xác thực lại hay không. Điều này khiến họ khó đánh giá hiệu suất của API và cải thiện trải nghiệm cho phù hợp.
  • Từ góc độ của IdP, họ cũng không thể biết liệu có hoạt động tự động xác thực lại hay không để đánh giá hiệu suất. Ngoài ra, liệu họ có tham gia quy trình dàn xếp rõ ràng cho người dùng hay không có thể giúp họ hỗ trợ thêm các tính năng liên quan đến bảo mật. Ví dụ: một số người dùng có thể thích cấp bảo mật cao hơn, yêu cầu dàn xếp người dùng rõ ràng trong quá trình xác thực. Nếu một IdP nhận được yêu cầu mã thông báo mà không cần quy trình dàn xếp như vậy, thì nhà cung cấp danh tính đó có thể xử lý yêu cầu theo cách khác. Ví dụ: trả về một mã lỗi để RP có thể gọi lại API FedCM bằng mediation: required.

Do đó, việc cung cấp thông tin về quy trình tự động xác thực lại sẽ có lợi cho nhà phát triển.

Với API cờ được chọn tự động, Chrome sẽ chia sẻ xem liệu có sự cho phép rõ ràng của người dùng hay không bằng cách nhấn vào nút Tiếp tục dưới dạng với cả IdP và RP, bất cứ khi nào tự động xác thực lại hoặc diễn ra dàn xếp rõ ràng. Việc chia sẻ chỉ diễn ra sau khi người dùng đã cấp quyền của người dùng để giao tiếp giữa nhà cung cấp danh tính (IdP/RP).

Chia sẻ qua IdP

Để chia sẻ thông tin với quyền truy cập của người dùng bài đăng của IdP, Chrome sẽ đưa is_auto_selected=true vào yêu cầu POST được gửi tới id_assertion_endpoint:

POST /fedcm_assertion_endpoint HTTP/1.1
Host: idp.example
Origin: https://rp.example/
Content-Type: application/x-www-form-urlencoded
Cookie: 0x23223
Sec-Fetch-Dest: webidentity

account_id=123&client_id=client1234&nonce=Ct0D&disclosure_text_shown=true&is_auto_selected=true

Chia sẻ RP

Trình duyệt có thể chia sẻ thông tin với bên bị hạn chế trong isAutoSelected thông qua IdentityCredential:

const cred = await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: 'https://idp.example/manifest.json',
      clientId: '1234'
    }]
  }
});

if (cred.isAutoSelected !== undefined) {
  const isAutoSelected = cred.isAutoSelected;
}

Thu hút và chia sẻ ý kiến phản hồi

Nếu có ý kiến phản hồi hoặc gặp bất kỳ vấn đề nào trong quá trình kiểm thử, bạn có thể chia sẻ tại crbug.com.

Ảnh chụp của Cô gái đội mũ đỏ trên Unsplash