从 Chrome 123 开始,您可以将网域提示与 Federated Credential Management API (FedCM) 搭配使用。借助 Domain Hint API,开发者可以仅显示其接受的网域中的联合登录账号,从而提供更好的用户体验。
Domain Hint API
借助 FedCM,用户可以利用身份提供方 (IdP) 提供的账号信息更轻松地登录依赖方(RP,指网站)。不过,在某些情况下,RP 已经知道只有与特定网域关联的账号才能登录网站。在需要访问的网站仅限于公司网域的企业场景中,这一点尤为常见。为了提供更好的用户体验,FedCM API 允许 RP 仅显示可用于登录 RP 的账号。这样可以防止用户尝试使用公司网域外的账号登录 RP,但稍后因未使用正确的账号类型而收到错误消息(或在登录失败的情况下保持静默)。
借助 Domain Hint API,RP 可以在 FedCM API 调用中指定 domainHint
属性,以便仅显示与用户匹配的账号。IdP 可以通过账号列表端点的响应提供 domain_hints
属性,以指明账号与哪些网域相关联。这样,浏览器就可以显示匹配的账号,而无需向 IdP 披露所请求的网域提示。
来自账号列表端点的 JSON 响应示例如下所示:
{
"accounts": [{
"id": "1234",
"given_name": "John",
"name": "John Doe",
"email": "john_doe@idp.example",
"picture": "https://idp.example/profile/123",
"approved_clients": ["123", "456", "789"],
}, {
"id": "5678",
"given_name": "Johnny",
"name": "Johnny",
"email": "johnny@idp.example",
"picture": "https://idp.example/profile/456"
"approved_clients": ["abc", "def", "ghi"],
"domain_hints": ["corp.example"]
}]
}
RP 可以使用 domainHint
属性调用 navigator.credentials.get()
来过滤账号。例如,假设某位用户访问了 corp-partner.example
并使用 corp.example
中的账号登录。网站会按如下方式调用该 API:
return await navigator.credentials.get({
identity: {
providers: [{
configURL: "https://idp.example/manifest.json",
clientId: "abc",
nonce: nonce,
domainHint : "corp.example"
}]
}
});
系统不会将 domainHint
值发送到账号列表端点进行服务器端过滤,因为该值可能是 IdP 的数字“指纹”收集矢量。而是会照常执行 FedCM 请求,并过滤掉与 navigator.credentials.get()
调用指定的 domainHint
值不匹配的账号。然后,Chrome 会向用户显示 FedCM 对话框,其中包含新账号列表。此方法与登录提示 API 类似,但这两个 API 回答的是不同的问题。Login Hint API 旨在回答“哪个是我想要的用户的标识符?”,而 Domain Hint 旨在回答“此账号必须属于哪个公司或服务器?”。
使用 domainHint: "any"
时,Chrome 会滤除没有任何网域的账号(即未传递 domain_hints
或 domain_hints
为空)。例如,这允许 RP 在其注册过程中仅允许受管理的账号的用例。
如果没有账号与 domainHint
匹配,FedCM 对话框会显示登录提示,以便用户登录与 RP 请求的提示相符的 IdP 账号。当用户点按提示时,系统会打开一个弹出式窗口,其中包含配置文件中指定的登录网址。然后,将登录提示和网域提示查询参数附加到该链接。