题干与适用场景
你负责一个多语言网站的“使用企业身份登录”入口。产品希望浏览器在用户明确选择后提供身份提供商账号,安全策略又要求不能依赖第三方 Cookie 追踪用户。请设计 relying party(RP)、identity provider(IdP)和服务器的协作,并说明 FedCM 不支持、用户拒绝、多个 IdP、会话建立与登出时怎么处理。
面试官考察点
高质量回答会先把 FedCM 定位为浏览器介导的身份联合接口,而不是新的令牌验证协议。候选人应说明 RP 通过 navigator.credentials.get() 请求身份,浏览器负责展示选择界面,IdP 返回短期 assertion 或授权结果,服务器仍验证签名、issuer、audience、nonce 和状态后才创建本地会话。还要解释第三方 Cookie 限制、权限策略、用户选择和传统 OAuth/OIDC 重定向回退之间的边界。
回答前需要澄清的问题
身份协议与信任关系
确认 IdP 使用 OAuth、OIDC 还是自定义 assertion,RP 是否允许多个 IdP,以及服务器已有的 JWKS、issuer 和 audience 配置。FedCM 不会替代 IdP 的签名密钥轮换和令牌校验。
浏览器和隐私目标
确认目标浏览器、嵌入 iframe、企业策略和第三方 Cookie 现状。FedCM 支持范围和 UI 行为依赖浏览器;不能把 Chrome 的行为假设成所有客户端都一致。
账户关联和退出策略
确认一个外部 subject 是否只能关联一个本地账户、重复邮箱如何处理、全局退出是否要求通知 IdP,以及用户拒绝授权后是否能改用密码或邮箱登录。
30 秒回答框架
“我把 FedCM 当作浏览器控制的身份选择层。RP 先从服务器拿到一次性状态和请求参数,再调用 navigator.credentials.get();浏览器展示 IdP 账号选择,IdP 返回受协议约束的身份结果。服务器验证 issuer、签名、audience、nonce、state 和账户映射,成功后才建立本站会话。前端区分用户取消、浏览器不支持、权限阻止和服务器拒绝;不支持时回退到经过 CSRF 和 PKCE 保护的 OAuth/OIDC 流程。登出要分别处理本站会话和 IdP 会话,不能假设清掉一个 Cookie 就完成全局退出。”
分步骤深入解答
第一步:建立 RP 与 IdP 配置
服务器为每个可信 IdP 保存 issuer、client ID、JWKS 地址、允许的协议和回调策略。前端只获得当前页面可用的配置标识,不接受用户输入的任意 IdP URL。多租户场景按租户绑定允许列表,避免开放重定向或把令牌送往错误租户。
第二步:创建一次性登录状态
用户点击登录后,RP 服务器生成不可预测的 state、nonce 和短期流程记录,绑定浏览器会话、目标租户和返回路径。前端调用 FedCM 时携带服务器下发的参数。state 和 nonce 必须在服务器保存并一次消费,不能由前端生成或长期复用。
第三步:执行浏览器介导请求
前端通过 navigator.credentials.get() 发起身份请求,页面需要满足安全上下文和相应权限策略。浏览器展示账号选择 UI,用户明确选择后才继续。FedCM 请求会使用专门的 fetch 目的标记,服务器据此区分身份流程;前端不要把 UI 是否出现当作认证成功。
第四步:服务器验证身份结果
服务器检查响应的 issuer、签名、过期时间、audience、nonce、state 和 subject,再按明确规则关联本地账户。邮箱只能作为辅助字段,不能在未验证的情况下直接合并账户。验证通过后才签发本站会话,并记录 IdP、subject、认证时间和风险信号。
第五步:设计回退与错误状态
浏览器不支持、权限策略阻止、用户取消和网络失败要分别处理。回退到 OAuth/OIDC 重定向时使用 PKCE、严格的 redirect URI、state 和 nonce;回退路径仍由同一个服务器账户映射层收口。前端提示下一步动作,不暴露 issuer、令牌或内部校验错误。
第六步:处理多个 IdP 与账户关联
若有多个 IdP,页面先展示业务允许的选项,浏览器和 IdP 再完成账号选择。服务器按 (issuer, subject) 建立稳定外部身份键,禁止仅凭邮箱自动合并。用户新增 IdP 时要求已登录会话或额外验证,并记录关联和解除关联审计事件。
第七步:登出、撤销与渐进发布
本站登出应撤销本地 session、清除安全 Cookie 并使刷新令牌失效;如果协议或 IdP 支持,再调用其登出机制。FedCM 对某些依赖 Cookie 的登出能力可能有限,因此要明确“退出本站”和“退出身份提供商”的差异。发布时按浏览器能力和错误率逐步启用,并保留可观测的回退开关。
高质量示范回答
我会把系统拆成浏览器身份选择、IdP 证明和 RP 会话三层。RP 服务器先生成短期 state、nonce 和租户绑定的流程记录,前端在安全上下文中发起 FedCM 请求。浏览器展示身份选择界面,用户确认后由 IdP 返回结果;服务器根据 issuer 的 JWKS 验证签名、audience、nonce、state、过期时间和 subject,再把 (issuer, subject) 映射到本地账户,验证通过后才建立本站会话。
浏览器不支持、策略阻止、取消和网络错误分别处理,并回退到使用 PKCE 的 OAuth/OIDC 重定向。回退不会绕过同一套服务器验证和账户关联规则。多个 IdP 只允许来自服务器配置的列表,邮箱不作为自动合并主键。登出至少撤销本站会话;若要退出 IdP,则使用其协议能力并向用户说明范围。灰度发布时观察成功率、取消率、回退率和账户关联异常,确保隐私收益没有换来不可诊断的登录故障。
常见错误
- 错误表现: 把 FedCM 返回对象当成已经登录。→ 失败原因: 浏览器介导选择不等于服务器验证了 issuer、签名和 nonce。→ 修正方法: 所有身份结果都进入统一服务器校验和会话创建流程。
- 错误表现: 只用邮箱匹配已有账户。→ 失败原因: 邮箱可能未验证、被回收或在不同 IdP 中重复。→ 修正方法: 以
(issuer, subject)为外部主键,邮箱只用于提示和经过确认的关联。 - 错误表现: FedCM 失败就直接把 token 放进前端存储。→ 失败原因: 增加 XSS 暴露面,也绕开原有会话策略。→ 修正方法: 让服务器交换并设置受保护的会话 Cookie,前端只处理状态。
- 错误表现: 认为退出本站会自动退出 IdP。→ 失败原因: 两个会话的生命周期和协议能力不同。→ 修正方法: 分别撤销本站会话和调用 IdP 登出能力,并清楚告知用户范围。
追问及应对
追问一:FedCM 和普通 OAuth 重定向是什么关系?
FedCM 改变的是浏览器介导的选择与跨站交互方式,OAuth/OIDC 仍负责授权和身份证明。两者可以共享 issuer、nonce、state、PKCE 和服务器账户映射;回退时不能删除这些校验。
追问二:为什么第三方 Cookie 限制会影响联合登录?
嵌入式 IdP 过去可能依赖第三方 Cookie 识别已登录用户。Cookie 被分区或阻止后,浏览器需要用显式的、用户可见的身份选择来继续流程。FedCM 降低了隐式跨站识别,但不会替应用决定账户权限。
追问三:用户拒绝一个 IdP 后能否自动换另一个?
不能把拒绝当成静默授权。可以在页面上提供用户主动选择的其他允许 IdP 或密码入口,并重新创建与目标 IdP 绑定的 state、nonce 和流程记录,避免复用一次已结束的请求。
追问四:如何验证灰度发布没有伤害登录成功率?
按浏览器、IdP、国家和嵌入场景拆分成功率、取消率、权限阻止率、回退率、账户关联冲突和平均完成时长。对异常 issuer、签名失败和 nonce 重放设置告警;保留服务器开关,在错误率升高时只关闭 FedCM 入口而不改动既有 OAuth 验证代码。