本文主要讲解SSO登录相关知识点,
主要从以下几个方面
- 是什么?
- 能做什么?
- 优缺点
- 登录完整流程图解
- 注销流程
- 总结
1.SSO是什么
单点登录的英文名叫做:Single Sign On(简称SSO)。
SSO是一种统一认证和授权机制,作用在多个应用系统,或者是分布式系统中,用户只需一次登录,就可以访问所有相互信任的其它应用系统,实现自动登录。
比如网页端的淘宝网和天猫商城,如果你登录了淘宝你会发现天猫也自动登录了。
2.SSO能做什么
- 统一登录 (一次登录,多平台共享);
- 完善的统一认证中心还可以兼容多平台的用户人员权限管理;
3.优缺点
3.1.优点
- 提高用户的效率,一次登录,多处使用
- 提高开发人员的效率
3.2.缺点
- 不利于重构
- 因为涉及到的系统很多,要重构必须要兼容所有的系统
- 无人看守桌面
- 因为只需要登录一次,所有的授权的应用系统都可以访问,可能导致一些安全隐患
4.SSO登录流程
4.1全局会话与局部会话
- 全局会话是SSO统一认证中心的全局会话
- 局部会话是子系统独有的会话,如果存在局部会话则可以直接访问受保护的资源无需请求认证中心做认证。
4.2会话三要素
- 若局部会话存在,全局会话一定存在 ;
- 若全局会话已存在,可以在每次登陆一个子系统后适当给局部会话增加超时时间;
- 局部会话超时时间远大于子系统 ;
- 全局会话存在,局部会话不一定存在;
- 全局会话销毁,局部会话必须销毁 ;
4.3令牌过期或失效
令牌过期或失效后-需要重新发起登陆认证流程。
5.不同场景下如何存储令牌
SSO的初衷是单点登录多处使用,单点退出,共同退出。安全性也很重要,令牌如何存储与交互呢?
一般情况下常见如下几种方式
- cookie
- url中携带令牌
- localStorage
5.1同域名不同站点
共享cookie,根据Http协议规定,同域下可以共享Cookie。用户登录后存储令牌到cookie。
5.1同主域名不同子域名
共享cookie,但是这里需要注意子域名间也是不能共享的,设置cookie的时候需要注意设置所属域为顶级域名。这样可以实现所有子域名下都可以共享到cookie。
5.3不同域
不同域的系统一般会将令牌信息作为参数携带过去
比如现有3个系统
- 认证中心地址 mydemo1.sso.com
- 系统A地址 mydemo2.sysa.com
- 系统B地址 mydemo3.sysb.com
综上图主要核心是未登录跳转SSO进行登录,登录完成后携带令牌到子系统。
上图只讲了系统A的登录流程
系统B也是类似的,唯一区别是登录系统B的时候认证中心已经存在局部会话,则无需再次跳转统一登录页面,只需要将令牌当成参数携带到系统B进行校验后创建局部会话即可。
6.SSO注销流程
为了保证安全性
在认证中心SSO服务注销全局会话或者在子系统注销会话的时候,需要将已经注册的子系统全部注销。
一般的做法是,在注册一个子系统的时候就会在认证中心SSO服务中存储令牌与注册系统的关联关系(其中包含子系统退出接口的链接地址)。在注销某个系统的时候,将令牌传输到认证中心,认证中心将去调用已经注册的系统的退出登录地址进行注销。
7.总结
SSO方式的登录主要涉及 SSO服务端,以及子系统客户端。主要通过与主SSO服务通信达到登录状态共享的效果。
服务端与客户端之间的通信可以使用HTTP、rpc 等交互方式
7.1子系统客户端
** 7.1.1登录**
- 拦截内部请求未登录,跳转至SSO认证中心 ;
- 接收认证中心返回的令牌 ;
- 与SSO认证中心通信,校验令牌的有效性 ;
- 建立内部局部会话 ;
7.1.2注销
- 拦截注销请求,向SSO认证中心发起注销请求。
- 提供销毁局部会话接口
7.2SSO认证中心服务端
7.2.1登录
- 验证用户的登录信息 ;
- 创建全局会话;
- 创建令牌 ;
- 下发令牌到客户端 (一般是链接中携带);
7.2.2注销
- 接收客户端发起的注销请求
- 对注册的系统发起注销
7.2.3其它
统一认证中心不仅可以做用户登录,还可以做一套统一的支持多平台的权限。在子系统登录的时候可以将菜单按钮权限等返回到子系统,子系统内部做局部会话。
这样既可以统一登录,也实现了用户权限统一管理,也就不用每个系统都去做一套内部的权限用户管理。
敬请期待程序员小强的后续文章
减少重复,干掉重复,写复用性更高的代码,才会美滋滋。