定义:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。
例子:比如淘宝和天猫,只要登陆其中一个系统,再进入另一个系统就不需要登陆。
核心问题:就以淘宝和天猫为例,存在两个问题:
- 淘宝和天猫的域名不相同,且 Cookie 不支持跨域使用
- 淘宝和天猫的服务器肯定也不是同一个,session 无法共享。
解决方案1
- 思路:将 Cookie 所在域设置为顶级域名;Session 的存储在多个服务器共享的存储设备上
- 缺点:相互信任的系统并不存在共同的顶级域名,本方案就无法使用。
PS : 本方案并不是真正意义上 SSO 实现
解决方案2:
- 思路:将认证功能独立形成 CAS(Central Authentication Service),访问各个相互信任的系统时,都重定向到 CAS 进行身份验证。
- 实现流程,简短描述:
- 用户访问 A 系统;A 系统重定向到 CAS 中
- 由于用户没登陆,重定向访问 CAS 是没携带数据,当 CAS 判断用户未登陆,则返回登陆页面
- 用户登陆,CAS 验证后生成 session、cookie和 token,并重定向到 A 中(其中cookie和ticket保存在客户端中)
- 用户重定向访问 A ,此时会携带 token。
- A 会将 token 交给 CAS 验证。验证通过后,A 生成session和cookie。【此时A登陆成功,而后与 A 交互,依靠 A 生成的 session和cookie】
- 用户访问互相信任的 B 时,B 也会重定向到 CAS
- 由于之前在 CAS 下设置了 cookie,本次访问 CAS 会携带 cookie
- CAS 根据 cookie 验证通过后,生成一个新的 token 返回给用户,并重定向到 B
- 用户重定向访问 B 并携带该 token
- B 去 CAS 验证 token。验证通过后,B 生成 session 和 cookie,而后用户和 B 的交互依靠这对 session 和 cookie。
-
实现流程,详细描述:
参考:
[1] 单点登录(SSO)看这一篇就够了-云栖社区-阿里云
[2] 什么是单点登录(SSO) - 掘金