单点登录 SSO 怎么实现?不同域名的网站如何共享登录状态?
下面是一段教学用的模拟面试。
🧑💻 面试官:用户登录 A 网站后,打开 B 网站不用再输入密码。你怎么实现?
🙋♂️ 我:把登录 Cookie 设成两个网站都能读取就行。
🧑💻 面试官:A 是 example-a.com,B 是 example-b.com,Cookie 的 Domain 能这么设置吗?
🙋♂️ 我:不同主域不能直接这样共享。
🧑💻 面试官:那 B 怎么知道用户已经登录?A 退出后,B 又会不会立即退出?
SSO 共享的是对身份服务的信任,不是让所有网站读取同一块 Cookie。各应用仍然可以有自己的会话。
面试速答(60 秒版)
SSO 是用户完成一次身份认证后,可以进入多个受信任应用,而不必每次重新输入凭据。
不同主域通常不能直接共享 Cookie。常见方案是把认证放在独立身份服务:应用未登录时,把浏览器重定向过去;身份服务利用自己域名下的会话识别用户,再通过 OIDC、SAML 等协议把认证结果交给应用。
应用验证结果后,建立自己的本地会话。用户进入第二个应用时,也会经过身份服务,但已有认证会话,就可能不需要再次输入密码。
因此要区分身份服务会话和各应用会话。统一登录不意味着统一退出自动完成,退出传播、会话有效期和权限校验都要单独设计。

知识点详解:一次认证,怎样变成多个应用的登录状态?
先看 Cookie 为什么不能直接搬过去
Cookie 有域、路径和其他发送条件。A 的服务端不能随便把 Cookie 的 Domain 指定为不相关的 B 主域,浏览器也不会把 A 的 Cookie 自动发送给 B。
同一父域下的子域可以采用某些共享 Cookie 方案,但这会扩大信任范围,也不是解决任意跨域登录的通用方式。
所以不要从“两个网站都属于同一家公司”,直接跳到“浏览器一定允许它们共享登录 Cookie”。
把浏览器带到身份服务的域名
假设有两个应用 A、B,以及统一身份服务。
用户首次进入 A,A 没有本地会话,于是发起认证请求并跳转到身份服务。用户完成认证后,身份服务在自己的域名下维持会话,再把浏览器带回 A。
以 OIDC 授权码流程为例,回调带回的是授权码。A 按协议兑换并验证认证结果,再建立自己的会话。不能把回调参数里写着“用户是张三”当作可信证明。
用户之后进入 B,B 同样发起认证。浏览器来到身份服务时,能按浏览器规则携带该域的会话 Cookie。身份服务认出用户,满足相应认证要求后,再把认证结果交给 B。
A 和 B 不需要读到身份服务 Cookie,也不需要互相复制 Cookie。Auth0 的 SSO 说明明确区分了这些会话层次。

应用不能只检查“有一个 Token”
身份服务签发的结果需要按协议验证。OIDC 中要检查可信签发方、受众、有效期等条件,并按所选流程验证签名和 nonce 等内容。认证请求和回调也要与当前浏览器发起的那次登录关联起来。
授权码流程还应采用符合安全要求的 PKCE 等保护,回调地址要受严格约束。具体要求应由成熟协议库实现,而不是自己拼一个“带用户 ID 的跳转链接”。参见 OIDC Core 与 OAuth 安全最佳实践。
另外,证明用户身份不等于授予所有业务权限。B 仍然需要检查该用户能否访问 B 中的资源。
为什么退出更复杂?
A 的本地会话和身份服务会话不是同一份记录。只删掉 A 的 Cookie,可能只退出 A;只退出身份服务,B 的本地会话也未必立即失效。
如果要求统一退出,要选择适合协议和产品的退出通知方式,并明确应用是否撤销本地会话、通知失败如何补偿、已有访问凭据能继续使用多久。
“以后不能无感登录”和“所有已有会话立即失效”,是两种不同的退出效果,需求里应该说清楚。

面试官继续追问
JWT 本身就是 SSO 吗?
不是。JWT 可以作为协议中的一种凭据格式,但不会自动完成认证跳转、结果验证、应用会话建立和退出传播。
能不能用隐藏 iframe 完成无感认证?
某些方案可以,但依赖浏览器 Cookie 与跨站限制,不能保证所有浏览器和环境都支持。需要准备符合平台限制的替代流程。
测试时最容易漏什么?
只测试“第二个网站免输密码”不够。还要测试认证结果不能给错误应用使用、回调不能被替换,以及各种退出操作对 A、B 和身份服务分别有什么影响。
面试速记卡
- SSO:一次身份认证,进入多个受信任应用。
- 跨域方式:通过身份协议交换认证结果,不是任意共享 Cookie。
- 会话层次:身份服务会话与各应用本地会话分别存在。
- 安全边界:验证认证结果,业务权限仍由应用检查。
- 统一退出:需要单独设计传播与失效规则。
公司面试真题
真题根据求职者公开面经整理,题意经过概括,非逐字原话或公司官方题库;本文为 Sunday 的独立解析。
字节跳动 · 前端 · 校招
后端鉴权中的 SSO 如何工作?(题意整理)
字节幸福里校招前端面经 1面+2面+3面+hr面(已意向) ↗
面试记录为 2021 年秋招;原帖编辑于 2021-10-09