假设用户X需同时登录站点A和站点B,这两个站点之间其实是有关联性的,但是如果用户认证数据不通用,那将需要注册或登录两次。
单点登录系统就是为了解决这种场景的问题,建立一种用户认证中心,只要经过这个中心注册或登录了某一站点服务的用户,总是能够认证登录这个中心所授权的其他所有服务。
关于CAS(Central Authentication Service)CAS是一种单点登录开源框架,遵循apache2.0协议,代码托管在github.com/apereo/cas上。
CAS作为一种单点登录框架,后端可配置不同的用户数据库,支持自定义验证或加密逻辑,并提供不同的协议用于与业务server(cas-client)间的通信。
CAS的源码是由java写的,因此对于java的web项目天生友好。当然只要实现CAS相关协议的client,无论是哪种语言实现的,都能集成到CAS认证框架中。
关于CAS前后端分离CAS5.x版默认的注册登录相关UI是以html形式内嵌在CAS-web项目中的,其中结合thymeleaf模板库来渲染html。
我们也可以通过前后端分离的方式来自定义我们的认证UI,我这里采取了spring+vuejs架构进行了测试一下,基本能跑通认证流程,大概过程用一张时序图来说明:
因为CAS由原来的结构改为了springboot+vuejs, 原有访问CAS页面的url要修改成访问vuejs所构建的前端页面,而这些url则由这些自定义的前端页面代理去访问调用。这些api包括:
- 通过(用户名|密码|当前service名)获取TGT票据, 如:
curl -v -X POST "https://svr.sso.com/cas/v1/tickets" -d "username=testuser&password=testpwd&service=http://xxx/xx"
响应的TGT信息存储在Location中。
- 通过TGT获取ST,如:
// 参数service需要进行urlencode
curl -X POST -v "https://svr.sso.com/cas/v1/tickets/TGT-4-xxxxxxx" -d "service=http%3a%2f%2fxxx%3a%2fxx"
这时直接能从响应结果中得到ST字符串。
- 通过ST访问service,正常下可完成登录:
http://xxx/xx?ticket=ST-3-BGJBL1wWjRw-prwoSYiyQaYzUNkAppledeMacBook-Pro
- 注销登录(清除TGT),单点登出,如:
curl -X DELETE -v "https://svr.sso.com/cas/v1/tickets/TGT-94-xxxxx"
正常情况下会返回已被清理的TGT字段。
热门评论
有没有更详细的说明,比如siteA和sso-web之间的跳转等,谢谢