同系列文章
单点登录:原理及概念(一)
单点登录:流程分析及实战(二)
单点登录( Single Sign On )简称SSO
,是解决多个应用系统中用户只需登录一次而其他系统自动感知已经登陆的一种技术,无需多次登录多次退出,即一处登录处处登录,一处注销处处注销
。
流程图如下所示:
1、访问系统首页,查看服务服务器是否已经登录,其实就是验证是否存在Session。
2、未登录则返回登录界面进行登录
3、登录之后,验证用户名密码是否正确, 生成Session以及Cookie ,后续所有的请求都会带着Cookie来验证是否存在Session,判断是否已经到登录。
4、退出的登录就是清除Session以及Cookie信息。
但在多系统中存在着两个问题
基于认证中心
的方式分析,其他方案大同小异。
假设客户端是OA系统
和CRM系统
,服务端是SSO系统。
第一次访问OA系统:
1、用户访问OA系统,判断是否登录,就是 判断是否存在局部会话。
2、OA系统发现没有登录 携带要访问的url做为参数重定向到SSO系统中,验证是否登录,就是 SSO判断是否存在全局会话。
3、不存在全局会话,响应到统一登录页面。
4、输入用户名密码,验证是否有效,若有效则创建全局令牌,以及创建全局会话。
一般的将 全局令牌作为key,用户信息作为value放入到redis中去 。同时将令牌放入到全局会话Session当中。
5、将令牌作为参数传给客户端,如 www.oa.com?token=dg32zfasdw3
6、客户端需要再次到SSO
校验令牌是否有效,同时需要将当前客户端的注销接口的地址作为参数,该步骤是避免步骤5中的token被篡改的问题,同时在SSO缓存客户端的退出接口,当某个客户端退出时,统一调用缓存中的所有退出接口,以达成一处退出处处退出的目的。
一般的缓存到redis中,全局令牌作为key:退出接口集合作为value。
7、校验成功,创建局部会话,以及将令牌存入到cookie中。
如:局部会话:key:isLogin,value:true
8、返回到客户端的请求地址。
OA系统已经登录,访问CRM系统:
1、验证是否登录,也就是判断是否存在局部会话。
2、系统发现没有登录 携带要访问的url做为参数重定向到SSO系统中,验证是否登录,就是 SSO判断是否存在全局会话。
3、存在全局会话, 因为OA系统已经登录,在SSO系统中留下了全局会话。
4、将令牌作为参数传给客户端,如 www.crm.com?token=dg32zfasdw3
5、客户端需要再次到SSO
校验令牌是否有效,同时需要将当前客户端的注销接口的地址作为参数,该步骤是避免步骤4中的token被篡改的问题,同时在SSO缓存客户端的退出接口,当某个客户端退出时,统一调用缓存中的所有退出接口,以达成一处退出处处退出的目的。
如:局部会话:key:isLogin,value:true
6、校验成功,创建局部会话,以及将令牌存入到cookie中。返回到客户端的请求地址。
上述是整个单点登录的流程,其实重点就在于Cookie与Session是如何配合使用以达到不同域名下共享的目的。
退出OA系统:
1、用户退出OA系统,销毁局部会话以及cookie,并重定向到SSO的退出接口。
2、从会话中获取令牌,销毁全局会话,清除redis中该token的用户信息,调用缓存中客户端的退出接口,
清除每个客户端的局部会话。
3、跳转登录页面
访问CRM系统:
1、访问CRM系统,局部会话不存在,重定向到SSO登录页面。
2、若局部会话存在,说明全局缓存中没有缓存该客户端的退出接口,所以会存在一定时间的延迟,当局部会话过期,重新去SSO校验是否登录的时候,发现全局会话已经不存在,或令牌已失效,即退出。
文字描述是笔者后续项目的一个大致流程图,也可以使用图上的流程,这儿图片是借用其他博主的,图片上的流程是客户端每个请求都会去SSO校验令牌是否有效,原理其实大同小异。
单点登录的实现方案一般包含:Cookies
、 分布式 Session 方式
、统一认证授权方式
等。目前的大型网站通常采用分布式 Session 及第三方认证授权的方式。
基于 Cookie 的单点登录是最简单的单点登录实现方式,它使用 Cookie 作为媒介,存放用户凭证。
用户登录父应用之后,应用返回一个加密的 Cookie,用户访问子应用的时候,携带上这个 Cookie,授权应用解密 Cookie 并进行校验,校验通过则登录当前用户。
这种方式虽然实现简单,但 Cookie 不够安全,容易泄漏,且不能跨域实现免登。
该方案的一个前提是Cookie Domain
设置于顶级域名上,这样各个系统是该顶级域名的子域名。
分布式 Session 实现单点登录原理是将用户认证信息保存于 Session 中,即以 Session 内存储的值为用户凭证,一般采用 Cache 中间件实现(如 Redis),同时在顶级域名下添加令牌。用户再次访问时,拿着域名下的令牌到应用服务端获取分布式 Session 来校验用户信息。
上述第三章就是基于认证中心来进行分析的。
下面是通过其他的具体方案来实现单点登录。
反向代理服务器对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容 原本就是它自己的一样。目的其实就是基于nginx来共享cookie。
未作了解。后续补充。
未作了解。后续补充。
参考及图片来源:
https://zhuanlan.zhihu.com/p/594656504
https://xie.infoq.cn/article/9be573d86ee2d7528eb84fdb7