首页 > 其他分享 >【实践篇】基于CAS的单点登录实践之路

【实践篇】基于CAS的单点登录实践之路

时间:2023-04-13 15:44:07浏览次数:33  
标签:单点 登录 CAS 实践 接口 认证 SSO

作者:京东物流 赵勇萍

前言

上个月我负责的系统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”: [email protected],
      “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协议哦。

标签:单点,登录,CAS,实践,接口,认证,SSO
From: https://www.cnblogs.com/Jcloud/p/17312370.html

相关文章

  • STAT0023实践统计
    STAT0023ComputingforPracticalStatisticsIn-courseassessment2,take-homecomponent(2022–23session)TableofContentsRubric.....................................................................................................................................
  • SonarQube(CE)版集群环境下的高可用性实践
    摘要:本文将详细介绍SonarQube的落地场景,集群环境(CE)下的高可用性(HA)最佳实践,包括部署策略、负载均衡、数据同步等方面的内容,以帮助您更好地构建一个健壮、高性能的代码质量分析系统一、为什么是SonarQubeSonarQube是一个广泛使用的开源的代码质量分析工具,它可以帮助开发团队发现和修......
  • mysql查询过程优化--理论及实践过程总结
    首先推荐一篇写的特别详细的帖子,感觉写的太好了。全看懂了,就不用看我下面的废话了。https://blog.52ipc.top/archives/149.html然后记录点自己解决的经验正式开始写一下我的优化过程:问题:MySQL查询count()from(括号里有七八个leftjoin),导致查询速度特别慢,结果大概是40s+1、......
  • iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践
    作者:京东零售姜海灵动岛是苹果在iPhone14Pro和iPhone14ProMax上首次提出的全新UI交互形式,创新性的让虚拟软件和硬件的交互变得更为流畅。当有来电、短信等通知时,灵动岛会变化形态,以便让用户能够更直观地接收到这些信息。而在用户使用一些应用App,比如音乐,并将其切换到后台......
  • 金融系统IT运维监控的探索与实践
    一、背景介绍金融行业作为国内信息化发展最早、最成熟的行业之一,在数字化应用不断深入的情况下,传统运维面对微服务、容器、虚拟化等显得愈加力不从心,金融行业要建立与全新架构能力相匹配的运维体系,提升业务运营感知能力、基础架构运维掌控能力和敏捷业务支撑能力,保障业务连续性和安......
  • kafka实践(二):部署Kafka需要衡量的问题
    该博文部分参考《Apachekafka实战》-胡夕的第三章Kafka线上环境部署,关于最佳实践的配置方面的建议,kafka在设计之初就需要考虑以下4个方面的问题:吞吐量/延时消息持久化负载均衡和故障转移伸缩性1.1 吞吐量/延时对于任何一个消息引擎而言,吞吐量都是至关重要的性能指标。那么何为吞......
  • 玖章算术CEO叶正盛在数据技术嘉年华分享NineData AIGC的应用实践
    4月8日下午,为期两天的第十二届数据技术嘉年华(DTC2023)在北京新云南皇冠假日酒店圆满落下帷幕。大会得到了工业和信息化部电子五所的支持和指导,围绕“开源·融合·数字化——引领数据技术发展,释放数据要素价值”这一主题,通过一场主论坛和十二场专题论坛,汇聚“产学研”各界数据技术......
  • 安全测试前置实践1-白盒&黑盒扫描
    作者:京东物流 陈维一、引言G.J.Myers在《软件测试的艺术》中提出:从心理学角度来说,测试是一个为了寻找错误而运行程序的过程。那么安全测试则是一个寻找系统潜在安全问题的过程,通过测试手段发现系统中可能存在的安全问题和风险,分析并进行优化,保障系统的安全质量。从应用安全维......
  • UVA1646 圈图的匹配 Edge Case
      n个点连成一个圆,求没有公共点的边集的个数不考虑第n条边f[n]=f[n-1]+f[n-2]现在考虑第n条边ans=f[n]+f[n-2] f=[0]*10005f[1]=1f[2]=2foriinrange(3,10004):f[i]=f[i-1]+f[i-2]while1:try:n=int(input())print(f[n]+f[n......
  • 如何在移动应用开发中,用小程序实践灰度发布策略
    在当今移动应用市场竞争激烈的环境下,如何更快地发布新版本、更精确地测试和调整、更好地了解用户需求和行为,成为了每个App开发者面临的重要挑战。在这个背景下,灰度发布和小程序容器技术成为了越来越受欢迎的解决方案。 灰度发布是指将新版本应用程序推送给一部分用户进行测......