共计 2838 个字符,预计需要花费 8 分钟才能阅读完成。
作者:京东物流 赵勇萍
前言
上个月我负责的零碎 SSO 降级,对接京东 ERP 零碎,这也让我想起了之前我做过一个单点登录的我的项目。想来单点登录有很多实现计划,不过最支流的还是基于 CAS 的计划,所以我也就分享一下我的 CAS 实际之路。
什么是单点登录
单点登录的英文名叫做:Single Sign On(简称 SSO)。SSO 的定义是在多个利用零碎中,用户只须要登录一次就能够拜访所有相互信任的利用零碎。之前我做的零碎,须要须要设计一套反对单点登录的鉴权认证零碎,所有零碎都基于一套鉴权零碎进行登录,并且能够实现各个系统之间的互信和跳转。所以就采纳了 CAS 架构。
什么是 CAS
CAS 架构的外围是须要搭建一个 CAS Server,该服务独立部署,领有独立三级域名,次要负责对用户的认证工作。他次要组成包含 WEB 前端提供登录页面,票据模块,认证模块。
外围票据:
a. TGT(Ticket Grangting Ticket):TGT 是 CAS 为用户签发的登录票据,有 TGT 就表明用户在 CAS 上胜利登录过。用户在 CAS 认证胜利后,会生成一个 TGT 对象,放入本人的缓存中 (Session),同时生成 TGC 以 cookie 的模式写入浏览器。当再次拜访 CAS 时,会先看 cookie 中是否存在 TGC,如果存在则通过 TGC 获取 TGT,如果获取到了 TGT 则代表用户之前登录过,通过 TGT 及拜访起源生成针对起源的 ST,用户就不必再次登录,以此来实现单点登录。
b. TGC(Ticket-granting cookie):TGC 就是 TGT 的惟一标识,以 cookie 的模式存在在 CAS Server 三级域名下,是 CAS Server 用来明确用户身份的凭证。
c. ST(Service Ticket):ST 是 CAS 为用户签发的拜访某一客户端的服务票据。用户拜访 service 时,service 发现用户没有 ST,就会重定向到 CAS Server 去获取 ST。CAS Server 接管到申请后,会先看 cookie 中是否存在 TGC,如果存在则通过 TGC 获取 TGT,如果获取到了 TGT 则代表用户之前登录过,通过 TGT 及拜访起源生成针对起源的 ST。用户凭借 ST 去拜访 service,service 拿 ST 去 CAS Server 上进行验证,验证通过 service 生成用户 session,并返回资源。
基于 CAS 的零碎实际计划
1. 业务背景
在我负责的我的项目零碎中,后盾业务采纳的是微服务架构,有对立的业务网关,所以基于对立的业务网关,整合客户其余零碎登录鉴权流程。具体业务架构图如下:
在此阐明一下,因为登录零碎的用户体系在不同的零碎中,所以我在设计 SSO 对立登录认证的时候,把 SSO 零碎与业务系统结构进去。而用户体系有两套,一套叫做采方用户体系,一套叫做供方用户体系。所以才会有如图所示的 SSO Server 服务,他自身不负责用户治理,但会通过对立标准接口的形式实现管制反转,实现对用户服务的调用。
2. 单点登录时序图
时序图如下:
如图所示,时序图标识的是两个零碎通过 SSO 服务,实现了单点登录。
3. 单点登录外围接口阐明
3.1 sso 认证跳转接口
调用阐明:
由利用侧发动调用认证核心的接口。
URL 地址:
https:// sso.com?appId=***&tenantType=1&redirectUri=***
申请形式:302 重定向
参数阐明:
appId: 对接 SSO 认证核心的利用惟一标识, 由 SSO 认证核心通过线下的形式颁发给各个利用零碎。
tenantType: 标记是供方登录还是采方登录。采方为 1,供方为 2.
RedirectUri: 利用回调地址。
3.2 重定向获取长期令牌 code 接口
调用阐明:
有认证核心发动,利用侧需实现的接口。认证核心通过 302 重定向,将 code 传给利用侧,利用侧自行发动通过长期令牌 code 换取 accessTokenInfo。
URL 地址:
https:// 利用域名?code=***
申请形式:GET
参数阐明:
Code: 长期令牌,无效工夫 5min
3.3 获取 accessTokenInfo 接口
调用阐明
由利用侧发动调用认证核心的接口。通过该接口能够获取 accessTokenInfo 信息,而后零碎自行生成本零碎 session 信息。
URL 地址:
https://sso.com/api/token/create?grantType=authorization_code&appId=yuncai&code=***
申请形式:GET
参数阐明:
appId: 对接 SSO 认证核心的利用惟一标识, 由 SSO 认证核心通过线下的形式颁发给各个利用零碎。
code: 长期令牌, 需加密
加密规定如下:
- Code 先进行 base64 加密
- 用认证核心给的 privateKey 进行加密(RSA 加密)。
- 加密后进行 URLCode 转码。
返回参数:
{“accessToken”:“****”, //token 令牌“expiresIn”: 7200, // 过期工夫“user”: {“username”:“zhangsan”,“fullName”:“张三”,“userId”:“1212”,“phone”:“13100000000”,“email”: zhangsan@test.com,“tenantId”:“S2131123”,“tenantType”: 1
}
}
3.4 刷新 Token 接口
调用阐明:
由利用侧发动调用认证核心的接口。当 token 快到生效期时,通过该接口能够刷新 accessTokenInfo 信息,而后零碎自行生成本零碎 session 信息。
URL 地址:
https://sso.com/api/token/refresh?appId=yuncai&accessToken=***
申请形式:GET
参数阐明:
appId: 对接 SSO 认证核心的利用惟一标识, 由 SSO 认证核心通过线下的形式颁发给各个利用零碎。
accessToken: 须要刷新的 token 值。
4. 单点登出逻辑
有单点登录,也会有单点登出,这样才会造成业务闭环,对于单点登出逻辑,根本相似登录的逆操作,时序图如下:
5. 单点登出外围接口阐明
5.1 登出 sso 认证核心跳转接口
调用阐明:
由利用侧发动调用认证核心的接口。
URL 地址:
https://sso.com/logout?redirectUri=***
申请形式:GET
参数阐明
RedirectUri: 利用回调地址。
5.2 利用零碎退出接口
调用阐明
有认证核心发动,利用侧需实现的接口。通过该接口触发个利用零碎革除缓存和 session 相干信息,实现零碎登出。
URL 地址:
https:// 利用零碎域名 /ssoLogout
申请形式:GET
header: logoutRequest:=accessToken
总结
对于 CAS 这种单点登录的架构,他是十分依赖于 cookie 的安全性的。所以 CAS 的安全性也在肯定水平上取决于 cookie 的安全性,所有加强 cookie 安全性的措施,对于加强 CAS 都是无效的。
最初提一句,肯定要应用 HTTPS 协定哦。