FedCM 与浏览器隐私:为新上下文设计账户流程
了解 FedCM 的浏览器边界,以及如何在不依赖跨站跟踪的情况下设计、测试和恢复联合登录。
联合凭据管理(FedCM)让身份提供方通过浏览器控制的界面帮助依赖方完成登录。根据账户和先前授权状态,浏览器可能要求用户选择或确认账户;符合条件的返回用户则可能自动重新认证,而不再看到相同的选择器。应用必须区分首次批准与返回登录,不能假设每次流程都会展示账户选择器。应用因此不必把嵌入式身份服务当成不受限制的第三方 Cookie 仓库。
FedCM 是身份 API,不是通用登录按钮,也不能识别未知浏览器。可用性会受到账户状态、用户选择、浏览器设置和提供方策略影响。产品应先定义账户流程和回退方案,只用于用户与参与服务有权建立的身份关系。
把每个公开流程都绑定到当前 W3C FedCM 依赖方登录算法:其中定义了 signin 请求和返回的凭据;首次创建账户对应请求注册许可;返回账户的自动重新认证则是同一登录算法中针对符合条件账户的分支。读者可以记录测试是否使用 signin、是否出现许可界面、IdentityCredential.isAutoSelected 是否为 true,以及服务器是否接受返回结果中的 audience 和有效期,以此验证边界。任何单项观察都不能独自授权账户;没有提示也不能证明个人或设备未知。
浏览器介入后改变了什么
传统联合登录可以跳转到身份提供方,也可能嵌入提供方内容。过去,嵌入内容经常依赖第三方 Cookie 记住 session。FedCM 把账户选择和部分断言交换放入浏览器界面,让用户批准关系,而不是让每个站点直接读取跨站状态。
浏览器不决定账户是否有权使用应用。依赖方服务器仍要验证 issuer、audience、有效期和请求绑定,并应用自己的 account linking 规则。浏览器提示成功不代表应用授权成功;没有提示也不能证明个人或设备未知。
账户选择器是一条用户可见边界。产品应说明哪个身份提供方参与、会建立什么关系,以及拒绝后会发生什么。不要用无限跳转隐藏拒绝,也不要要求用户为阅读公开内容提供 credential。
FedCM 不会让所有请求自动私密。依赖方仍会处理断言结果和自己的 session,身份提供方仍运行账户服务。URL、请求体、日志、分析、跳转、支持工具和删除都应一起审查,浏览器界面不能替代数据最小化。
API、注册要求和提示样式会随浏览器版本变化。记录经过测试的版本范围和 provider 合约,不要声称所有浏览器展示相同字段。兼容性说明应写清实际流程和回退路径。
定义依赖方合约
从用户流程开始:用户从哪里发起登录、哪些账户可以出现、需要什么 disclosure,以及取消或重试时必须保留哪些应用状态。断言只应完成可见而有限的任务,例如创建 session 或连接账户。
账户连接必须明确。如果用户已在本地登录,应说明新账户会登录、连接还是替换当前账户。合并记录前需要主动确认;发生冲突时保留当前工作并提供恢复路径。
服务器必须验证每个响应,包括 issuer、audience、nonce 或请求绑定、有效期和签名。限制失败交换速率并确定性处理重放。日志只记录经过脱敏的失败阶段,不保留完整 token。
应用 session 需要明确寿命。Cookie 和其他状态遵循应用安全政策,账户变化时轮换或撤销,并提供真正结束依赖方 session 的退出动作。浏览器中的账户选择不能替代服务器 logout、恢复和权限检查。
应用可以支持多个身份提供方。用用户能理解的语言说明账户是彼此独立还是可以连接。提供方不可用时,允许产品既有的本地或支持流程继续,并避免反复打开用户已拒绝的选择器。
同意、披露与用户控制
第一次提示应回答三个问题:谁在请求、会使用哪个账户、批准后应用会做什么。说明应靠近发起动作。显示名称或头像只用于声明用途,并允许用户在创建 session 前纠正意外账户。
同意不是未来所有操作的永久授权。用途、连接关系或所需数据变化时应重新确认。只保留履行决定所需的最小记录,并提供撤销 session 或解除连接的路径。浏览器记忆与产品的合规记录不能互相替代。
拒绝是正常结果。公开功能继续可用;如果产品支持本地登录或恢复,应显示相应路径。文案不要暗示浏览器损坏,也不要强迫用户为公开内容披露身份。
账户选择会暴露敏感上下文。不要把 provider 标识、token 或详细 profile 数据写入 URL、截图、分析标签或异常。测试环境使用合成账户,支持案例结束后删除临时 fixture。
退出后也要解释边界。用户可能退出应用但仍登录身份提供方,也可能单独撤销 provider 关系。界面应区分这些动作,并在需要时链接到提供方的账户控制页面。
第三方 Cookie 与存储边界
FedCM 可以减少第三方 Cookie 依赖,但不会授予通用存储例外。提供方不能因为用户批准账户就假定 iframe 内的 Cookie 可读。依赖方只保存自己的 session,提供方则说明账户管理所需的第一方路径。
存储分区会让同一 provider 在不同顶层站点下看起来像新环境。这是上下文结果,不是个人身份结论。存储分区指南介绍空上下文和用户控制的第一方 handoff。
不要把 FedCM 结果用作 fingerprint。提示缺失可能来自浏览器、账户、设置、权限、政策或版本。应根据可见功能选择分支,不要收集属性或计时来推断身份。
网络信号也应单独评估。provider 会看到提供服务所需的网络信息,依赖方看到自己的请求上下文。网络身份隐私指南说明登录结果为何不能成为稳定网络身份。
删除要覆盖关系两端。依赖方删除 session 和连接记录,provider 提供自己的解除或账户管理路径。区分因审计必须保存的记录与可立即删除的数据,不要因为使用过 FedCM 就长期保存完整 assertion。
构建可靠回退
可靠流程包含浏览器介入路径、provider 第一方路径和经产品批准的恢复路径。回退不是绕过浏览器政策,而是为不支持 API、用户拒绝或账户需要帮助时提供的可见路线。
第一方路线应使用短寿命且由服务器授权的 handoff。不要在 URL 放 credential;将引用绑定到依赖方、账户动作和有效期,并在使用后失效。取消后应返回已知页面并保留当前表单或草稿。
恢复流程需要负责人和速率限制。只有产品本来就授权时才提供账户查询、本地 credential 或支持验证。不要要求用户上传浏览历史或关闭隐私设置。每个结果都要说明是否创建 session、是否保留工作以及下一步。
重试前先分类:缺少 API、没有 provider 账户、用户拒绝、assertion 无效、handoff 过期和服务器超时由不同层负责。只记录流程阶段、应用版本、浏览器族、provider 类别和可见结果。
每个分支都需要可访问状态。辅助技术用户应听到可以选择账户、批准已取消或恢复还需动作。键盘焦点移到解释下一步的标题或错误;禁用控件应有原因和可用替代。
账户流程回退验收矩阵
协议依据使用 W3C 依赖方登录算法 和 MDN FedCM API 参考。每一行都用合成账户执行,只有可观察结果符合应用合约时才算通过。
| 可观察的起始条件 | 主路径动作 | 用户可见的回退 | 验收证据 |
|---|---|---|---|
| FedCM 不可用,或 provider 无法提供账户 | 不打开选择器 | 提供 provider 第一方路径或批准的恢复流程 | 不发送 credential;页面宣布回退;服务器验证成功前不存在依赖方 session |
| 用户拒绝选择器 | 结束 FedCM 尝试 | 保留公开内容并显示本地登录或恢复 | 事件记录 declined;当前工作保留;不创建 session |
| 用户取消、handoff 过期或服务器超时 | 停止交换并使引用失效 | 返回已知页面并提供有限重试 | 页面说明登录未完成,草稿保留,重试不能复用过期引用 |
| assertion 未通过 issuer、audience、nonce、签名或有效期检查 | 在服务器拒绝响应 | 显示批准的恢复流程 | 服务器返回失败结果,只保存脱敏阶段;界面不能声称登录成功 |
| 返回账户与当前本地登录账户冲突 | 不自动连接或替换记录 | 要求用户明确选择连接、切换或恢复 | 用户确认前工作和 session 不变;最终 session 只对应一个账户 |
端到端验收走查
以上 W3C 算法和 MDN API 参考用于核对浏览器步骤,provider 的公开配置文档用于核对可用性。在正常产品流程中,用户点击登录,依赖方在干净测试 profile 中调用 FedCM,已配置的 provider 提供一个合成账户。浏览器显示账户选择器;用户批准后,依赖方把返回的 assertion 发送到服务器。服务器校验 issuer、audience、nonce、签名和有效期,只创建一个依赖方 session,并带着可访问的成功提示返回用户之前保存的任务。证据包只包含流程阶段、provider 类别、校验结果、session 结果和可见文案,绝不包含 assertion 本身。
用受控的负向场景确定失败归属:
| 可观察结果 | 区分方法 | 必须满足的验收结果 |
|---|---|---|
| API 不可用 | navigator.credentials 或 FedCM 方法缺失,或在请求 provider 前被阻止 | 不出现选择器,也不交换 credential;显示批准的第一方路径并记录 api_unavailable |
| 用户拒绝 | 已显示选择器,合成用户选择取消或拒绝 | 记录 declined;保留当前任务;不创建 session;提供本地登录或恢复 |
| provider 配置问题 | API 可以调用,但 provider 不符合条件或无法提供已配置的测试账户 | 记录 provider_not_configured 或 provider_account_unavailable;不把 assertion 送入 session 创建;显示 provider 路径或恢复流程 |
| 服务器 assertion 校验失败 | 选择器结果到达服务器,但 issuer、audience、nonce、签名或有效期校验失败 | 返回失败结果,只记录脱敏校验阶段;不创建 session;显示恢复流程 |
只有分支标签、网络行为、服务器 session 状态、保留的工作和用户可见文案全部一致时才算通过。这样可以分别识别浏览器能力、用户选择、provider 配置和服务器信任判断,不把任何单一结果当作身份信号。
使用合成账户测试
测试环境使用专用 provider 与依赖方账户。分别验证干净 profile 和返回 profile,不要把真实邮箱、生产 assertion 或恢复码放进 fixture。两端数据由不同系统和删除责任人管理。
覆盖完整流程:打开登录、看到账户选择、批准、拒绝、取消、返回应用、允许的自动重新认证、退出和恢复。断言用户可见结果,而不只是 JavaScript callback。返回账户测试还要分别核对先前授权、是否出现选择器以及服务器最终创建的 session。服务器创建正确 session 且页面可访问地报告结果后才算通过。
覆盖双账户、已连接其他本地用户、provider session 过期以及账户不可提供等边界。应用不能静默替换工作或合并记录,每条路径都应回到先前任务。
比较浏览器时保持应用版本、provider 配置和合成数据一致。记录 FedCM 是否可用、出现什么提示、用户动作、服务器结果和使用的 fallback。版本变化应更新支持矩阵,不应变成普遍平台结论。
测试关闭选择器、callback 时刷新、批准后断网、handoff 过期和浏览器重启。避免重复 session,保留允许保存的非敏感输入,并提供有限重试。失败交换不能显示为登录完成。
自动化测试中每个 session 只有一个 profile owner。Selenium profile 指南介绍隔离、版本记录和干净关闭。FedCM 断言应位于应用边界,不依赖无关 fingerprint 属性集合。
发布审查与运维
浏览器、provider、依赖方代码、account linking、consent 文案或 storage 模型变化时,应重放同一合成流程并比较可见结果。保留用途明确的小型 fixture:首次批准、拒绝回退、返回账户、账户冲突和恢复。
发布说明要写明受影响的应用流程和用户是否需要操作,不要把一次浏览器提示变化描述成所有平台的结论。临时 fallback 应标出受影响版本和继续方法,并在支持矩阵变化后更新。
运维指标应报告功能事件,而不是原始身份材料。可以记录批准或拒绝、交换结果、回退原因、恢复完成和应用版本。限制保留期与访问范围,不能用汇总重建跨站身份图。
事故处理要保护用户当前工作。验证失败时保留政策允许的表单,解释状态并提供恢复路径。不要先清 profile 或复制 Cookie;只保存最小脱敏证据,隔离失败 fixture 并在调查后退役。
产品负责人应定期验证退出、解除连接和删除。退出结束依赖方 session,解除动作更新关系,过期 handoff 不再有效。干净与返回 profile 都要检查。
支持培训应使用与界面相同的术语,区分 provider 账户、依赖方 session、本地连接账户和恢复引用。跨边界问题只请求定位失败阶段所需的最小合成或脱敏标识,不索取完整 token 或 profile。
无障碍和本地化属于身份合约。翻译 provider 名称、账户用途、拒绝结果和恢复动作时不能改变含义。测试长账户名、受支持的 RTL、缩放、减少动画和纯键盘操作。
集成应可逆。provider 或浏览器版本可能改变可用性,应用应能为有限受众停用主路径并保留批准的 fallback。记录变化、受影响流程和用户动作,限制运行时或依赖变化的影响。
公开来源
这里链接的 W3C FedCM 文档是 First Public Working Draft,MDN 的 API 页面也标注了有限且实验性的兼容性。应把这些页面作为协议和兼容性参考,再核实应用实际支持的 provider、浏览器版本和服务器契约。