浏览器默认禁用第三方Cookie时如何实现跨域SSO?谷歌方案原理是什么
跨域SSO实现问题解答
谷歌跨域设置Cookie的核心原理
你观察到的谷歌账号登录后自动为youtube写入Cookie的能力,核心依赖浏览器内置的第一方集合(First-Party Sets)白名单。Chrome等主流浏览器默认将谷歌旗下所有关联域名(google.com、youtube.com、accounts.youtube.com等)统一识别为同一信任主体,内嵌的accounts.youtube.com iframe在accounts.google.com页面中不会被判定为第三方上下文,因此浏览器允许该iframe读写自身域名的Cookie,不会触发拦截规则。
普通开发者的独立域名未被纳入该内置白名单,也没有自行申请第一方集合认证的情况下,跨域iframe的Cookie读写操作会被浏览器默认拦截,这就是你复刻相同流程却无法生效的根本原因,无报错无响应是浏览器拦截跨域第三方Cookie的标准表现。
第三方Cookie禁用场景下的可行跨域SSO方案
目前主流浏览器已全面默认禁用第三方Cookie,依赖iframe读写跨域Cookie的旧方案已经无法落地,推荐采用以下兼容性更高的实现:
方案1:OAuth2.0授权码跳转流(全浏览器兼容)
这是当前行业通用的标准实现,完全不依赖第三方Cookie:
- 业务域名登录入口直接跳转至中心化认证域授权页,携带当前业务域名的回调地址参数
- 中心化认证域校验用户登录态:未登录则引导用户完成登录,已登录则直接生成临时授权码
- 中心化认证域自动携带授权码跳转回业务域名的回调接口
- 业务域名后端用授权码向中心化认证域后端兑换有效令牌,写入业务域名自身的Cookie或localStorage即可
- 后续其他业务域名触发登录流程时,中心化认证域已存在用户登录态,全程无需用户重复操作,感知上就是自动登录
方案2:申请第一方集合(仅Chrome生态支持)
如果你的所有业务域名和认证域名都属于同一企业主体,可以向Chrome官方申请将所有域名纳入公开第一方集合,审核通过后,跨域iframe读写Cookie的操作会被浏览器放行,和谷歌的实现逻辑完全一致。
方案3:FedCM联邦身份API(现代浏览器支持)
W3C推出的专门用于替代第三方Cookie实现联邦身份认证的标准API,目前Chrome、Edge、Firefox均已支持:
- 中心化认证域按照FedCM规范发布身份提供商配置、客户端配置、端点声明
- 业务域名调用
navigator.credentials.get({ identity: { providers: [/* 你的认证域配置 */] } })发起登录请求 - 浏览器原生接管身份校验流程,直接调用中心化认证域的登录/态校验接口,无需内嵌iframe,不会触发第三方Cookie拦截
- 校验完成后直接将令牌返回给业务域名侧
旧方案失效说明
你之前测试的两种iframe读写Cookie的方案,本质都是依赖第三方Cookie的旧实现,在当前浏览器安全策略下已经没有生产落地的价值,不需要继续投入优化。
内容的提问来源于stack exchange,提问作者Nikhil S
相关产品推荐
相关产品推荐

