需求场景
当公司网站越来越多时,还是希望账号能打通,登录公司a网站后,打开b网站需要登录时可以不用输密码直接登录,主要是方便用户登录,简化流程,不用记那么多的密码。单点登录可以说是这一痛点的解决方案了。
常用解决方案
方案一:基于cas认证的单点登录
如果公司使用java技术栈,接入开源的cas是很不错的。
apereo/cas: Apereo CAS - Identity & Single Sign On for all earthlings and beyond. (github.com)
方案二: 基于oauth2.0授权的单点登录
研究下来,发现oauth2.0授权和cas认证的核心流程思想基本一样。没啥太明显的区别。cas是个开源的框架,直接接入,开箱即用,省心。而oauth2.0只是个授权协议规范而已,具体怎么实现要自己去写,目前网上也没有什么比较好的类似于cas这种可以开箱即用,稳定维护的项目。所以与其接入一个不怎么靠谱的开源项目,不如搞懂流程,方便后续的踩坑。
- 用户访问a网站需要登录,a网站后台跳转sso认证中心,
- sso认证中心根据cookie判断用户未登录,弹出登录页面
- 用户填完密码,sso校验后生成一次性鉴权码code,设置cookie,session 并携带code重定向至a网站前端页面
- 前端页面获取url参数中的code,向a网站后台发送ajax请求
- 后台接收到code请求sso认证中心
- sso认证中心返回access_token
- 后台获取accessToken并保存,返回前端自己的鉴权accessToken
- 前端获取a网站的accessToken,登录成功
- 用户访问b网站要登录,b网站后台跳转sso认证中心
- 由于访问a网站时,sso留下了cookie,现在sso根据cookie和session知道用户已经登录过,不再弹出登录框,直接返回code
- 后续流程保持不变