记一次单点登录重复请求的问题

Published on 2024-01-11 08:56 in 分类: 随笔 with 狂盗一枝梅
分类: 随笔

最近在做单点登录对接,其流程如下

image-20240110152128867

B系统携带ticket请求A系统获取token之后,A系统会删除ticket记录,因此ticket只能用一次,如果A系统接收到了相同的ticket换取token的请求,就会报错,我遇到的就是这个问题:B系统十次里面会有两三次都会收到两次ticket请求,所以B系统会拿着ticket请求A系统两次,第一次成功,第二次失败,页面上显示失败信息

一开始以为B系统代码有问题,但是B系统从access log上来看,确确实实收到了两次请求。。A系统在单点的时候,实际上是新开了浏览器tab页,然后访问了单点的地址,不可能存在重复请求的问题,否则不得新开两个tab页了。。到底是什么原因呢?

为了更清晰的看到单点过程,然后我使用了charles抓包看了下

image-20240111081936279

根据时间顺序,我在上图标注了下1/2/3,它们三个地址是一样的,1是http地址,2/3是https地址,2是成功的请求,3是失败的请求,(其实看到这个我心里已经大概知道是什么原因了):

第一个请求:请求http,但是nginx配置了自动跳转https,所以重定向到了2

第二个请求:http重定向到了这里,正常的单点登录处理之后,重定向到正常的成功页面

第三个请求:和2一样的https请求,就因为这个请求,前端页面才显示单点登录失败的,但是它又是谁发起的呢?这失败的原因关键就在于此,该次请求不总是有,所以展示的结果就是有时候成功,有时候失败。

实际上第三次失败的请求是谷歌浏览器自动发起的,百度搜索“谷歌浏览器自动跳转https”,能搜索到很多相关的信息,谷歌浏览器在地址栏贴上http请求,有可能会自动跳转到https的地址,如果不是手动贴上去,就算是程序这么干,谷歌浏览器也会有一样的行为。

真相大白了,先是nginx配置了强制https,所以有了第二次的正常请求;同时,谷歌浏览器也有自动转换https的机制,所以会有第三次相同的请求,解决方法其实很简单,把配置的http地址改成https地址,既不会发生nginx强转了,谷歌浏览器也不会有什么诡异操作了

改成https地址之后,一切正常了, end.


#单点登录 #谷歌浏览器 #谷歌