跳转至

单点登录(SSO)的实现方案

一、什么是 SSO

一个用户在多个互相信任的应用系统中,只登录一次,就能访问所有系统。

二、常见协议

1. CAS(Central Authentication Service)

经典 SSO 协议,有独立的 CAS Server。流程:

  1. 用户访问 App1,未登录,重定向到 CAS Server。
  2. 用户在 CAS Server 登录。
  3. CAS Server 重定向回 App1,带 Ticket(ST)
  4. App1 拿 Ticket 去 CAS Server 校验,成功后建立本地 Session。
  5. 用户访问 App2,同样重定向到 CAS Server,发现已有 SSO Session(TGC cookie),直接发 Ticket,不需要再登录。

2. OAuth2 / OIDC

现代 Web 常用:

  • Authorization Code 模式:最安全。
  • 第三方登录(微信、GitHub 登录)本质就是 OAuth2。

流程:

App -> 授权服务器: 跳转到登录页
用户输入账号密码
授权服务器 -> App: 回调带 code
App -> 授权服务器: code 换 access_token
App -> 用户: 登录成功

3. JWT

前后端分离、微服务场景:

  1. 登录后签发 JWT。
  2. 后续请求带 Authorization: Bearer <token>
  3. 每个服务自己验签,不需要调用认证中心。

三、方案对比

方案 适用
CAS 企业内部多系统、传统 Web
OAuth2/OIDC 第三方登录、开放平台
JWT 前后端分离、微服务、APP

四、关键点

1. 登出

SSO 登出要通知所有系统:

  • CAS:单点登出,CAS Server 通知各 App 销毁 Session。
  • JWT:服务端维护黑名单。

2. 安全性

  • HTTPS 必须。
  • Cookie 设 HttpOnly、Secure、SameSite。
  • Token 过期时间合理,用 Refresh Token。
  • 防止 CSRF。

3. 跨域

SSO 域和业务域不同,要处理跨域 Cookie。

面试加分

  • 为什么需要 Ticket?防止把凭证直接放在 URL 里。
  • JWT 不适合存放大量用户信息,payload 放 userId 即可。