oauth2.0–基础–6.1–SSO的实现原理
1、什么是SSO
1.1、概念
- 在一个 多系统共存 的环境下,用户在一处登录后,就不用在其他系统中登录,就可以访问其他系统的资源。
- 用户环境
- 浏览器:只能同一个浏览器,不会出现A浏览器登录成功后,打开B浏览器自动登录
- 手机:只能同一手机,不会出现A手机登录成功后,打开B手机自动登录
1.2、场景
1.2.1、场景1
我有个门户网站,这个网站上面多个系统链接页面,我只要登录了门户网站,我在门户上就通过点击A系统的链接,免登录直接跳转到A系统。
1.2.2、场景2
我有个A系统,我要访问B系统的一条数据B1(url),我登录A系统后,我希望能直接访问B1。
2、设计
实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效性,因此要点也就以下几个:
- 存储信任
- 验证信任
只要解决了以上的问题,达到了开头讲得效果就可以说是SSO。
2.1、使用Cookie
把信任存储在客户端的Cookie里
2.1.1、实现流程
2.1.2、会产生2个问题
- Cookie不安全:可以通过加密Cookie来处理
- 不能跨域免登
2.2、使用统一认证中心(SSO系统)
2.2.1、实现流程
一般来说,大型系统会采取在服务端存储信任关系的做法,实现流程如下所示:
2.2.2、需要解决的重点问题
- 如何高效存储大量临时性的信任数据
- 可以采用 redis分布式缓存的方案,既能提供可扩展数据量的机制,也能提供高效访问
- 如何防止信息传递过程被篡改
- 一般采取数字签名的方法
- 要么通过数字证书签名
- 要么通过像md5的方式
- 需要SSO系统返回免登URL的时候对需验证的参数进行md5加密,并带上token一起返回,最后需免登的系统进行验证信任关系的时候,需把这个token传给SSO系统,SSO系统通过对token的验证就可以辨别信息是否被改过。
- 一般采取数字签名的方法
- 如何让SSO系统信任登录系统和免登系统
- 可以通过白名单来处理,说简单点只有在白名单上的系统才能请求生产信任关系,同理只有在白名单上的系统才能被免登录。