从 Chrome 122 开始,针对 Federated Credential 的 Disconnect API Management API (FedCM) 可以使用。通过 Disconnect API 可让依赖方断开其用户与 身份提供方账号,而不依赖第三方 Cookie。此外, 我们对 FedCM 的同一网站处理方式进行了几项更新。
断开 API 连接
当用户创建依赖方(RP,即使用 (例如使用身份提供方进行身份验证) 提供方(IdP,即提供身份验证和账号信息的服务) 通常将连接记录在其服务器上。存储的 则 IdP 可以跟踪用户已登录的 RP, 优化用户体验例如,为了在使用 用户返回 RP,则具有 IdP 的用户账号会被视为 以便启用自动重新身份验证和 显示所用账号的个性化按钮。
有时,IdP 会提供 API,用于将账号与 RP 断开连接。不过, 断开连接流程已通过身份验证,并需要 IdP Cookie。在世界中 没有第三方 Cookie,当用户访问 RP 时,没有浏览器 供 RP 与 IdP 断开连接的 API。由于可能有多个 IdP 来自与指定 RP 关联的同一 IdP 的账号,那么断开连接流程需要 您知道取消关联的是哪个账号。
脱节 API 允许用户同时断开 IdP 账号与浏览器上的 RP 与 IdP 服务器上相同。用户需要 已使用联合凭据完成身份联合 Management API (FedCM)。用户断开连接后,系统会将该用户 当用户下次尝试使用 IdP 登录 RP 时。
断开 IdP 与 RP 之间的连接
如果用户之前已通过 FedCM 使用 IdP 登录 RP,
浏览器会将这些关系存储为
账号。RP 可通过调用
IdentityCredential.disconnect()
函数。此函数可通过
RPG 框架。RP 需要传递 configURL
,即其使用的 clientId
以及用于断开 IdP 的 accountHint
。账号
提示可以是任意字符串,只要断开连接端点可以识别
例如电子邮件地址或用户 ID(未必是
与账号列表端点提供的账号 ID 匹配:
// 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()
会返回 Promise
。此 promise 可能会抛出
例外情况:
- 用户尚未通过 FedCM 使用 IdP 登录 RP。
- 该 API 是在没有 FedCM 权限政策的 iframe 中调用的。
- config网址 无效或缺少断开连接端点。
- 内容安全政策 (CSP) 检查失败。
- 您有待处理的断开连接请求。
- 用户在浏览器设置中停用了 FedCM。
当 IdP 的断开连接端点返回 响应,则 RP 和 IdP 会在 且 promise 已解析。会断开连接的用户账号 (来自断开连接的响应) 端点。
设置 IdP 配置文件
为了支持 Disconnect API,IdP 必须支持断开连接
端点,并在其 IdP 中提供 disconnect_endpoint
属性及其路径
配置文件。
{
"accounts_endpoint": "/accounts",
"id_assertion_endpoint": "/assertion",
...
"disconnect_endpoint: "/disconnect"
}
在断开连接端点上解除账号关联
通过调用 IdentityCredential.disconnect()
,浏览器会发送跨源
POST
带有 Cookie 且内容类型为
application/x-www-form-urlencoded
连接到此断开连接端点,
以下信息:
属性 | 说明 |
---|---|
account_hint |
有关 IdP 账号的提示。 |
client_id |
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
收到请求后,IdP 服务器应执行以下操作:
- 使用 CORS(跨源资源)响应请求 分享)。
- 验证请求是否包含
Sec-Fetch-Dest: webidentity
HTTP 标头。 - 将
Origin
标头与由client_id
确定的 RP 来源进行匹配。 如果不匹配,则拒绝。 - 找到与
account_hint
匹配的账号。 - 从 RP 的关联账号列表中取消关联用户账号。
- 以 JSON 格式使用已识别用户的
account_id
响应浏览器 格式。
响应 JSON 载荷示例如下所示:
{
"account_id": "account456"
}
如果 IdP 希望浏览器断开与以下对象关联的所有账号的连接
RP,请传递与任何账号 ID 都不匹配的字符串,例如 "*"
。
现在,当 RP 和 IdP 位于同一网站时,系统会跳过检查 /.well-known/web-identity
在开发 FedCM 系统时,测试或预演 RP 服务器网域可能是
子网域。例如,生产 IdP 服务器
位于 idp.example
且同时位于临时 RP 服务器和临时 IdP 服务器
目前在staging.idp.example
。但是,由于必须将众所周知的文件
在 IdP 服务器的 eTLD+1 的根目录下,该位置必须在
idp.example/.well-known/web-identity
,它是生产服务器。开始时间
开发者不一定能将文件放到
环境,这样可防止他们测试 FedCM。
从 Chrome 122 开始,如果 RP 网域和 IdP 网域相同,Chrome 不会检查已知文件。这样,开发者就可以 出现过。
子资源现在可以设置同网站登录状态
以前,Chrome 只允许设置登录
状态(针对
使用 Set-Login: logged-in
标头),而请求是
同源
所有祖先实体。这阻止了通过
同一网站
fetch()
请求设置登录状态。
例如,假设有一个网站,用户可以在上面输入自己的用户名,
您在 idp.example
设置了密码,但凭据会发布到 login.idp.example
与fetch()
共享。使用“登录状态”记录浏览器的登录状态
API 无法实现,因为这两个网域是跨域且同网站。
通过此项更改,我们放宽了对 Login Status API 的访问权限的要求,
同网站
所有祖先实体,使上述示例能够设置
使用 HTTP 标头 (Set-Login:
logged-in
) 表示login.idp.example
的登录状态。
摘要
通过使用 Disconnect API,FedCM 现在可以断开 RP 与 IdP 之间的连接
而无需依赖第三方 Cookie为此,请调用
RP 的 IdentityCredential.disconnect()
。借助此函数,浏览器
将请求发送到 IdP 的断开连接端点,以便 IdP 可以终止
再通过浏览器进行连接。
我们已宣布,当 RP 时,系统会跳过 /.well-known/web-identity
检查
和 IdP 是同一网站,以便进行测试。另外,设置登录信息
通过来自同一网站 IdP 子资源的 HTTP 响应标头的“状态”现为