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-out
và unknown
. 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.
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.
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 APInavigator.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.
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.
- Nhấn vào nút Go to the IdP and sign in (Chuyển đến IdP và đăng nhập).
- Đăng nhập bằng tài khoản tuỳ ý.
- Chọn Phiên đã hết hạn trên trình đơn thả xuống Trạng thái tài khoản.
- Nhấn vào nút Cập nhật thông tin cá nhân.
- 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.
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:
code
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_error
và temporarily_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: optional
là hà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