首页 > 其他分享 >网络基础 登录对接CAS-跨域导致的一个意想不到的Bug

网络基础 登录对接CAS-跨域导致的一个意想不到的Bug

时间:2023-05-08 23:12:09浏览次数:26  
标签:跨域 登录 sit CAS Bug Cookie https com example

登录对接CAS-跨域导致的一个意想不到的Bug

背景描述

业务需求是平台登录,接入Cas验证

问题描述

  1. 平台登录页,点击登录方式,跳转Cas登录页,提交登录请求,结果发现,又返回平台登录页;
  2. 再次点击登录方式,登录成功,跳转到目标页面。

问题排查

排查方向-浏览器兼容性问题

这个问题,开发人员在其本地开发环境复现不了,仅在我本机可以,因此,他们初步怀疑,这个是浏览器兼容性问题。开发人员经过一段时间排查,终究没找出问题所在。

排查方向-跨域问题

笔者无意中发现,登录成功后,再次退出登录,然后重复该动作,这种情况下是,问题是不可复现的,但通过点击流量收藏夹中的网址,实现登录时,问题就重现了。

于是,仔细检查了下收藏的网址,发现是网址使用的是http协议,非https,然后我很开心的告诉开发,这种情况下能复现。

经过一番分析后,开发人员得出了结论,就是跨域问题,导致前端获取不到存储到localStorage中的Token(最终会存储为Cookie),所以访问后端时,没有携带该token值,最终登录失败,并基于此准备一些相对复杂的解决方案。

根因分析与解决方案

根因分析

结合自己的分析,及开发的解释,依旧是云里雾里,感觉开发没有说清楚里面的逻辑,终不能说服自己,于是结合请求过程,同开发进行二次探讨。

以下是整个操作过程中,笔者抓取的一些关键请求信息

  1. 访问前台页面
GET http://target.sit.example.com/
  1. 自动触发登录检测请求

    GET http://target.sit.example.com/api/admin/checkLogin
    

    关键响应头及响应体

    Set-Cookie: _TOKEN_KEY_=; Path=/; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0
    
    {"msg":"to login","result":{"redirect":"https://wcas.sit.example.com/cas/login?service=https%3A%2F%2Fmg.sit.example.com%2Fapi%2Fadmin%2Flogin%3FloginType%3DCAS-DATA"},"succ":"jump"}
    
  2. 检测结果为未登录,程序根据目标平台提示,跳转Cas登录页

    GET https://wcas.sit.example.com/cas/login?service=https%3A%2F%2Fmg.sit.example.com%2Fapi%2Fadmin%2Flogin%3FloginType%3DCAS-DATA
    
  3. 提交Cas登录

    POST https://wcas.sit.example.com/cas/login?service=https://mg.sit.example.com/api/admin/login?loginType=CAS-DATA
    

    关键响应头:

    Location: https://mg.sit.example.com/api/admin/login?loginType=CAS-DATA&ticket=ST-43509-fE0FeJmFdA3TlLW9dV9Y-casnode1&language=zh&country=CN&variant=CN
    Set-Cookie: CASTGC-D-SS="";Version=1;Path=/cas;Domain=.sit.example.com;Expires=Thu, 01-Jan-1970 00:00:00 GMT;Max-Age=0
    Set-Cookie: CASTGC-D=TGT-939448-9ZhaREwusKuYIvucwdASdPOoCx6yIwpopNWdhS4M2Ousq2Opsu-O2QFU3-casnode1;Path=/cas;Domain=.sit.example.com
    Set-Cookie: CASTGC-D-SS=TGT-939448-9ZhaREwusKuYIvucwdASdPOoCx6yIwpopNWdhS4M2Ousq2Opsu-O2QFU3-casnode1;Path=/cas;Domain=.sit.example.com;HttpOnly;Secure;SameSite=None
    
  4. 根据服务器返回302响应状态码及location请求头,自动重定向

    GET https://mg.sit.example.com/api/admin/login?loginType=CAS-DATA&ticket=ST-43509-fE0FeJmFdA3TlLW9dV9Y-casnode1&language=zh&country=CN&variant=CN
    

    关键响应头

    Location: https://target.sit.example.com/#/home?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIwMTM2NzU5OSIsImV4cCI6MTY4MDI2NzE0M30.auqOB37uknCdoleGdEyCjpUoPlrEtsoV4z1p4zWmpsI&loginType=CAS-DATA
    Set-Cookie: JSESSIONID=node0vltj8s5ysap840ozd62zcyau14488.node0; Path=/
    Set-Cookie: _TOKEN_KEY_=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIwMTM2NzU5OSIsImV4cCI6MTY4MDI2NzE0M30.auqOB37uknCdoleGdEyCjpUoPlrEtsoV4z1p4zWmpsI; Path=/
    
  5. 根据服务器返回302响应状态码及location请求头,自动重定向

    GET https://target.sit.example.com/
    
  6. 自动触发是否登录检测请求

    https://target.sit.example.com/api/tenant/checkLogin
    

    关键请求头

    Cookie: JSESSIONID=node0hjccl321oho11ioud9caco7bg14483.node0; _TOKEN_KEY_=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIwMTM2NzU5OSIsImV4cCI6MTY4MDI2NzE0M30.auqOB37uknCdoleGdEyCjpUoPlrEtsoV4z1p4zWmpsI
    

    关键响应

    HTTP/1.1 200 OK
    Set-Cookie: JSESSIONID=node01bh0somchrk8d109bhvjeav6ji14490.node0; Path=/
    Set-Cookie: _TOKEN_KEY_=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIwMTM2NzU5OSIsImV4cCI6MTY4MDI2NzE0NH0.qFHISyVRkWcpP7QYkgmb0K32NKhHxUInNQWTNFTfrx0; Path=/
    
    {"msg":"","result":{"accountModifyNum":0,"contacts":"赖大家","email":"","entTenantCode":"WPMJ1d20230317111905","entTenantType":2,"phone":" ]  }","registerTime":"2023-03-17","tenantCode":"WPMJ1d20230317111905","tenantType":2,"userAccount":"cNmSiwUONW","userStatus":1,"userType":1},"succ":"ok"}
    

结合上述请求过程,和开发讨论哪一步导致登录失败,结论是上述第5步,也就是使用ST换取token后。

和前端开发人员沟通,第5步执行完成后,需要将程序返回的token存储到Cookie中,开发截图代码如下

image-20230331204632752

从上图可知,token是在重定向完成后,通过获取浏览器中查询参数获取的,这里对开发提出质疑,这一步能否获取到参数,开发最终验证的结果是可以取到值。

按理,此时代码存储token,按理也是存储到https协议的域名下面,不应该是存到http协议的域名下。所以,提出假设,这里window.localStorage.getItem('loginType')未获取到值,因为这个一开始是访问的http协议的站点时存储到localStorage中的,此时访问的是https协议的站点,跨域了,所以取不到值,导致后续的请求Cookie没有携带对应的Token值。

基于这个假设,让开发去掉获取登录类型的判断,然后构建验证,结果发现成了。

那如何解释,第二次点击登录方式就成功登录呢?此时已经是https协议了,二次点击时不存在跨域问题,重新执行一次登录请求,因为上次登录过Cas,所以不会再调跳转Cas登录页,然后就成功了。

解决方案

一开始和开发讨论,这个是否考虑存储到某个文件,然后从文件读取,或其它者跨域存储方案,后面想一下,直接从接口返回登录类型即可。

标签:跨域,登录,sit,CAS,Bug,Cookie,https,com,example
From: https://www.cnblogs.com/shouke/p/17281646.html

相关文章

  • idea实现远程debug
    nohupjava-Xmx256m-Xms128m-Xmx256m-Xms128m-Dspring.cloud.nacos.discovery.ip=150.158.28.239-Xdebug-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005-jar./love-user-management-1.0-SNAPSHOT.jar>/dev/null2>&1&其实......
  • 【C++判断(switch...case、if...else)】
    【C++判断(switch...case、if...else)】switch...case语法:switch(表达式){case常数表达式:语句;break;  default:语句;break;}1.表达式必须是一个整型或枚举类型2.在一个switch中可以有任意数量的case语句。每个case后跟一个要比较的值和一个冒号。3.当被......
  • 【debug】常见的问题,怎么引用上一层目录
    根据代码执行方式的不同,有两种解决方法。在vscode中执行代码,需要设置一下env参数{//使用IntelliSense了解相关属性。//悬停以查看现有属性的描述。//欲了解更多信息,请访问:https://go.microsoft.com/fwlink/?linkid=830387"version":"0.2.0","c......
  • PHP Windows 下 XAMPP 的 xdebug 配置
    在IntelliJ下调试PHP的断点有时候还是比较困惑的。同时根据你使用的xdebug配置也有关系。xdebug2.x下面的配置是xdebugVersion2的配置,如果你使用xdebug3.x版本的话,配置是不同的。[XDebug]zend_extension="php_xdebug.dll"xdebug.remote_autostart=1xdebug.profil......
  • Python neopixel package bugs All In One
    PythonneopixelpackagebugsAllInOnePython3Pythonneopixellibrarydocshttps://docs.circuitpython.org/projects/neopixel/en/latest/index.htmlhttps://github.com/adafruit/Adafruit_CircuitPython_NeoPixelbugs❌https://github.com/adafruit/Adafruit......
  • 跨域问题和解决方式
    一、同源策略和跨域同源策略是一种约定,它是浏览器最核心也最基本的安全功能。同源是指"协议+域名+端口"三者都要相同,当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。二、跨域产生的问题同源策略会阻止一个域的javascript脚本和另外一个域进行交......
  • scandir,major和minor,state,无锁机制----比较交换CAS Compare And Swap,dirent,sprintf,fop
    文章目录1.Linuxc目录操作函数scandir2.Linux系统设备(device)的major和minornumber3.state4.无锁机制----比较交换CASCompareAndSwap5.dirent6.sprintf7.fopen8.atoi函数9.strtok10.strtol1.Linuxc目录操作函数scandir(1)头文件:#include<dirent.h>定义函数:intscandir(......
  • 神奇的 SQL 之 CASE表达式,妙用多多 !
    CASE表达式之概念相信大家都用过CASE表达式,尤其是做一些统计功能的时候,用的特别多,可真要说什么是CASE表达式,我估计还真没几个人能清楚的表述出来。CASE表达式和“2+1”或者“120/3”这样的表达式一样,是一种进行运算的功能,正如CASE(情况)这个词的含义一样,用于区分情况,在有......
  • 使用set构造bug
    目录使用set构造BUG原理:std::set的insert相同obj只会保留一个使用set构造BUG原理:std::set的insert相同obj只会保留一个当我们setA.insert(1),setA.insert(2),setA.insert(3)后,会发现setA里的1,2分别只有1个,故可以使用重载对象的operator==来让一个对象可能无法insert展开查......
  • cassandra-0.6.1安装配置(与集群)
    关键字:cassandra-0.6.1安装配置(与集群)1下载Cassandrahttp://cassandra.apache.org/下载版本0.5.1。2安装Cassandra安装目录D:\apache-cassandra-0.5.1。在此需要修改两个配置文件1修改conf目录下的log4j.properties文件:log4j.appender.R.Fil......