FedCM 更新:解除 API 和两项更新的关联

从 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 服务器应执行以下操作:

  1. 使用 CORS(跨源资源)响应请求 分享)
  2. 验证请求是否包含 Sec-Fetch-Dest: webidentity HTTP 标头。
  3. Origin 标头与由 client_id 确定的 RP 来源进行匹配。 如果不匹配,则拒绝。
  4. 找到与account_hint匹配的账号。
  5. 从 RP 的关联账号列表中取消关联用户账号。
  6. 以 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.examplefetch()共享。使用“登录状态”记录浏览器的登录状态 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 响应标头的“状态”现为