关于iframe通过url传递token,设置为cookie后,在不同版本浏览器,父项目可能设置不成功

2,233 阅读2分钟

背景

公司接到项目紧急开发,该项目分为主项目子项目,我们公司负责的是子项目。目前,需要通过单点登陆集成两个项目,公司希望通过前端传递token的方式,实现两个项目的集成。

主项目服务端传递token给到主项目客户端,主项目客户端使用iframe,通过url传参的方式,给到子项目客户端,子项目客户端再将token传给子项目服务端。

项目使用环境(内网:使用http;低版本:使用谷歌,但浏览器版本不高(50~100))

过程

首先,我们(子项目)将url拿到的token设置到cookie。(url的参数可以通过history获取,本文用字符串miyao代替),因此,我们写了一个简单html用iframe去嵌套子项目,发现了一个有趣的现象,即子项目设置完cookie后,父项目在不同浏览器版本下有时会设置成功cookie,有时不成功(注:同域cookie会共享)。

注意:测试过程不要在浏览器同时打开子项目跟主项目,以及iframe的url避免使用localhost,这会影响测试结果。

第一种:设置cookie

子项目设置cookie

   document.cookie = `token=${父级token=miyao}; Expires=Wed, 15 Nov 2023 03:18:42 GMT;`

主项目设置cookie

    <iframe width="1000" height="1000" src="http:// 192.168.103.4:8000/#/Monitor/RealTime/EnvironmentVideo?token=miyao" frameborder="0"></iframe>

谷歌107版本:

子项目结果

image.png

主项目结果 image.png

谷歌70版本:

子项目结果

5bf074526f6a856e2f07d5aa482c6c6.png

主项目结果 5bf074526f6a856e2f07d5aa482c6c6.png

第二种:设置cookie + Secure + SameSite(没有使用https测试)

mdn上指出,如果使用https,加上' SameSite=none; Secure;'即可实现跨域设置cookie。

子项目设置cookie

   document.cookie = `token=${父级token=miyao}; Expires=Wed, 15 Nov 2023 03:18:42 GMT; SameSite=none; Secure;`

主项目设置cookie(不变)

    <iframe width="1000" height="1000" src="http:// 192.168.103.4:8000/#/Monitor/RealTime/EnvironmentVideo?token=miyao" frameborder="0"></iframe>

谷歌107版本:

表现一致

谷歌70版本

主项目结果

189efd211a09dc2e4251036c2f6d624.png

官方解释

对于低版本浏览器,iframe可以设置成功,而高版本却没有设置成功,mdn上有这样的介绍

image.png

image.png

因此,当我们使用70版本时,由于浏览器版本低(可能存在csrf),反而能设置成功,因为SameSite默认时none,而且不需要Secure,所以能发起http请求。

解决方案

由于后端在识别cookie后,会清空掉cookie并重新发送新的cookie给到前端;同时,又要求前端持续把token发送给到后端,因此,我们将token放到headers里面任意一个值,并且后端做相关配置,允许接收改值。

谷歌107版本:

image.png

谷歌70版本

bf298933931071f376b3354c1e47029.png