返回笔记首页

什么是 SSO 单点登录

主题配置

SSO 全称 Single Sign-On,中文叫单点登录。一句话解释:登录一次,全部系统通行


一、用生活场景理解

你去一个大型商场,进门保安核验了你的身份证,给你发了一个手环。之后你去里面的每一家店,店员看到手环直接放行,不会再让你掏身份证。

SSO 就是这个手环机制——登录一次换到一个凭证,公司所有系统认这个凭证就够了。


二、没有 SSO 之前是什么样子

假设公司有三个系统:OA 系统、CRM 系统、财务系统。

markdown
用户打开 OA      →  输入账号密码登录
用户打开 CRM     →  再输一次账号密码
用户打开财务     →  再输一次账号密码

换个浏览器       →  三个全重来
Token 过期了    →  三个全重来

每个系统各自维护一套用户表、一套登录逻辑、一套 Token,互相不认识。用户体验差,运维成本高,安全管控也分散。


三、有了 SSO 之后

markdown
用户打开 OA      →  跳到认证中心登录一次
用户打开 CRM     →  认证中心发现已登录,直接放行,不需要再输密码
用户打开财务     →  同上,直接放行

任意系统登出     →  认证中心通知所有系统同步登出

四、SSO 核心流程

markdown
┌──────────────┐        ┌──────────────────┐        ┌─────────────┐
│   用户浏览器   │        │  认证中心 (IdP)    │        │  业务系统 A  │
└──────┬───────┘        └────────┬─────────┘        └──────┬──────┘
       │                         │                          │
       │   1. 访问业务系统 A                                 │
       │ ──────────────────────────────────────────────── > │
       │                         │                          │
       │                         │   2. 未登录,重定向认证中心 │
       │ < ────────────────────────────────────────────────  │
       │                         │                          │
       │   3. 跳转认证中心,带上 redirect 参数               │
       │ ──────────────────── >  │                          │
       │                         │                          │
       │   4. 输入账号密码         │                          │
       │ ──────────────────── >  │                          │
       │                         │                          │
       │   5. 验证成功,下发 Token + 种 SSO Cookie            │
       │ < ──────────────────────│                          │
       │                         │                          │
       │   6. 携带 Token 跳回业务系统 A                       │
       │ ──────────────────────────────────────────────── > │
       │                         │                          │
       │                         │   7. 业务系统验证 Token    │
       │                         │ < ──────────────────────  │
       │                         │                          │
       │                         │   8. 验证通过,返回用户信息 │
       │                         │ ──────────────────────  > │
       │                         │                          │
       │   9. 登录成功,进入系统    │                          │
       │ < ─────────────────────────────────────────────── │
       │                         │                          │
       │   10. 再访问业务系统 B    │                          │
       │ ──────────────────── >  │                          │
       │                         │                          │
       │   11. 检测到 SSO Cookie,直接下发 Token,跳过第 4 步  │
       │ < ──────────────────────│                          │

关键点:第 10 步访问系统 B 时,认证中心检测到浏览器里的 SSO Cookie,确认已登录,直接颁发新 Token 给系统 B,用户全程没有输密码。


五、为什么需要 SSO —— 五个真实痛点

痛点 1:用户体验差

公司员工每天用 5 个内部系统,没有 SSO 每个都要登录一次。Token 过期时间设短了频繁掉线,设长了安全风险大,左右为难。

痛点 2:账号管理混乱

每个系统各自维护用户表,员工入职要在 5 个系统分别创建账号,离职要在 5 个系统分别禁用。忘了禁某一个,离职员工还能访问内部数据——这是真实发生过的安全事故。

痛点 3:安全策略不统一

密码强度要求、登录失败锁定、双因素验证,各系统各搞各的,安全水平参差不齐。SSO 把认证收归一处,统一加固一个地方就够了。

痛点 4:代码重复维护

每个前端项目都写一套登录页、Token 存储、刷新逻辑、路由守卫,同一个 bug 要修 N 个地方。

痛点 5:审计困难

用户的登录行为分散在各系统日志里,要查一个人今天访问了哪些系统,得去 5 个地方分别捞日志。SSO 把认证收归一处,一份日志全覆盖。


六、常见 SSO 协议对比

协议 全称 适用场景 特点
OAuth 2.0 Open Authorization 第三方授权(微信登录、GitHub 登录) 授权框架,不是认证协议本身
OIDC OpenID Connect 企业 SSO 主流方案 OAuth 2.0 上加了身份认证层,基于 JWT
SAML 2.0 Security Assertion Markup Language 老企业、政府系统 XML 格式,重但成熟稳定
CAS Central Authentication Service 高校系统最常见 简单轻量,适合内网场景

公司自研系统做 SSO,通常选 OIDC(JWT 友好,前端容易处理)或者自己实现一套简化版 Token 认证中心。


七、单点登出(Single Logout)

登录容易被忽视的是登出。SSO 里的登出分两种:

局部登出:只退出当前系统,其他系统仍保持登录。适合临时借用他人电脑的场景。

全局登出(Single Logout):退出认证中心,所有系统同步登出。适合安全要求高的场景。

markdown
用户在系统 A 点退出
  → 系统 A 清掉本地 Token
  → 通知认证中心销毁 SSO Session
  → 认证中心广播通知系统 B、系统 C
  → 系统 B、C 各自清掉本地 Session / Token
  → 用户所有系统全部下线

前端实现全局登出同步,通常用 BroadcastChannel 在同源多 Tab 之间广播登出消息,配合后端的 Session 失效通知。


八、前端在 SSO 里具体负责什么

认证中心是后端搭的,前端主要负责这几件事:

markdown
1. 路由守卫      →  未登录时拦截,重定向到认证中心登录页
2. Token 接收    →  认证中心回跳时,从 URL 参数里取 Token 存好
3. 请求拦截器    →  每个接口请求自动在 header 带上 Token
4. 无感刷新      →  Token 过期时自动用 Refresh Token 换新的,用户无感知
5. 多 Tab 同步   →  一个 Tab 登出,其他 Tab 同步跳到登录页
6. SDK 封装      →  把上面五件事打成 SDK 包,其他项目 install 即用

九、Token 无感刷新流程(前端核心难点)

markdown
正常请求
  前端  ──── 携带 Access Token ────> 后端
  前端  <─── 200 正常响应 ─────────  后端


Token 过期场景
  前端  ──── 携带过期 Token ────────> 后端
  前端  <─── 401 Unauthorized ──────  后端

  前端(内部处理,用户无感知)
    │
    ├── 检测到 401,加刷新锁(防并发)
    │
    ├── 携带 Refresh Token 请求 /auth/refresh
    │     └── 后端返回新的 Access Token + Refresh Token
    │
    ├── 更新内存里的 Access Token
    │
    ├── 用新 Token 重放刚才失败的请求
    │
    └── 返回正常响应给业务代码(业务代码完全不知道发生了什么)


并发场景(同时有 5 个请求,全部 401)
  第 1 个 401  →  抢到锁,开始刷新
  第 2~5 个 401 →  检测到锁,进入等待队列

  刷新成功  →  广播新 Token,队列里 4 个请求拿到 Token 重新发
  刷新失败  →  清 Token,全部请求报错,跳登录页

十、一句话总结

SSO 解决的核心问题是:把分散在各系统里的认证逻辑收归一处统一管理

对用户来说是体验提升,对公司来说是安全收口,对开发来说是减少重复代码。前端侧的难点集中在 Token 的安全存储、无感刷新的并发处理、多 Tab 状态同步这三块,也是面试里最常被追问的地方。