作者:京东物流 赵勇萍

前语

上个月我担任的体系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: 暂时令牌,需加密

加密规则如下:

1.Code先进行base64加密

2.用认证中心给的privateKey进行加密(RSA加密)。

3.加密后进行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协议哦。

本文正在参与「金石计划」