在 FedCM 中支持自动重新验证

Chrome 支持在 FedCM 中自动重新进行身份验证

Federated Credential Management API (FedCM) 是用于实现可保护隐私的身份联合的 Web API。借助身份联合,RP(依赖方)依赖 IdP(身份提供方)为用户提供帐号,而无需新的用户名和密码。

FedCM 让浏览器能够了解 RP 和 IdP 交换信息的上下文。它会告知用户所分享的信息和权限级别,并防止出现意外滥用行为。自 108 版起,FedCM 便已在 Chrome 中推出。

在 Chrome 115 中,FedCM 开始支持自动重新身份验证,这不仅改善了用户体验,而且可在获得初步同意后更轻松地向 RP 重新进行身份验证。

自动重新验证

目前,用户通过 FedCM API 在 RP 上通过 IdP 创建了联合帐号后,下次访问相应网站时,他们需要在界面中执行相同的步骤。这意味着,用户需要以手动方式明确地重新确认,以重新进行身份验证并继续执行登录流程。

虽然在用户创建联合帐号以防止跟踪之前提供明确的用户体验(这是 FedCM 的主要目标之一),但一旦用户完成一次操作,便会变得不必要的繁琐:在用户授予允许在 RP 与 IdP 之间进行通信的权限之后,确认他们之前已经实施了其他明确的用户确认的某项隐私或安全优势。因此,我们引入了更精简的用户体验,RP 可以为回访用户选择。

FedCM 自动重新身份验证(简称“自动重新验证”)可让用户在使用 FedCM 进行初始身份验证后返回时,自动重新进行身份验证。这里的“初始身份验证”表示用户首次在同一浏览器实例上点按 FedCM 登录对话框中的“Continue as...”按钮,以登录 RP 的网站或登录 RP 的网站。

用户点按以创建帐号或进行身份验证的对话框。
用户点按以创建帐号或进行身份验证的对话框。

选择自动重新验证身份

虽然我们引入了自动重新身份验证功能以提供更好的用户体验并符合规范,但如果不更改任何代码,默认用户体验将有所不同。启用自动重新验证功能后,浏览器会根据您在开发者提供的 navigator.credentials.get() 提供的 mediation 选项中选择的选项来更改其行为。

const cred = await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: "https://idp.example/fedcm.json",
      clientId: "1234",
    }],
  },
  mediation: 'optional', // this is the default
});

mediation凭据管理 API 中的一个属性,其行为方式与 PasswordCredentialFederatedCredential相同,并且部分受 PublicKeyCredential 支持。该属性接受以下四个值:

  • 'required':始终需要中介才能继续,例如,点击界面上的“继续”按钮。如果您的用户希望在每次需要进行身份验证时都明确授予权限,请选择此选项。
  • 'optional'(默认):如果可能,自动重新验证;否则,需要中介。我们建议您在登录页面上选择此选项。
  • 'silent':如果可能,自动重新验证身份;如果没有,则静默失败,无需中介。我们建议在专用登录页面以外的页面(例如,货运网站上的商品页面或新闻网站上的文章页面)上选择此选项,以便用户保持登录状态。
  • 'conditional':用于 WebAuthn,目前不适用于 FedCM。

在以下情况下,使用此调用会自动重新进行身份验证:

  • FedCM 可供使用。例如,用户尚未在设置中全局停用 FedCM 或为 RP 停用 FedCM。
  • 用户仅通过一个具有 FedCM API 的帐号在此浏览器上登录了网站。
  • 用户使用该帐号登录 IdP。
  • 自动重新验证未在过去 10 分钟内发生。
  • 上次登录后,RP 未调用 navigator.credentials.preventSilentAccess()

如果满足上述条件,系统会在调用 FedCM navigator.credentials.get() 后立即开始尝试自动重新验证用户身份。

用户通过 FedCM 自动重新进行身份验证。

使用 preventSilentAccess() 强制执行中介

在用户退出后立即自动重新进行身份验证,这不会带来非常好的用户体验。因此,FedCM 在自动重新身份验证后会留出 10 分钟的静默期以防止此行为。这意味着,自动重新验证最多每 10 分钟进行一次,除非用户在 10 分钟内重新登录。当用户明确从 RP 退出(例如,通过点击退出按钮)时,RP 应调用 navigator.credentials.preventSilentAccess(),以明确请求浏览器停用自动重新身份验证。

function signout() {
  navigator.credentials.preventSilentAccess();
  location.href = '/signout';
}

用户可以在设置中选择停用自动重新验证

用户可以通过“设置”菜单选择停用自动重新验证功能:

  • 若使用桌面版 Chrome,请前往 chrome://password-manager/settings > 自动登录。
  • 在 Android Chrome 上,依次打开设置 > 密码管理工具 > 点按右上角的齿轮图标 >“自动登录”。

通过停用此切换开关,用户可以完全停用自动重新身份验证行为。如果用户在 Chrome 实例上登录 Google 帐号并启用了同步功能,则此设置会存储在设备之间并保持同步。

分享反馈

如果您要测试 FedCM,可以在 crbug.com"Blink>Identity>FedCM 组件下分享您的反馈或遇到的任何问题。

照片由 Noah Samuel Franz 提供,由 Unsplash 用户