iframe嵌入第三方网站页面实现免登录

6,762 阅读2分钟
背景:

新系统中开一个菜单,内嵌老系统的页面。 新老系统域名不同

技术方案:

前端在新系统的页面中通过iframe嵌入老系统的页面

具体实现流程: 新系统点击菜单,请求后端接口拿到一个凭证,通过iframe的src属性配置老系统中间页,并携带上目标跳转页和后端返回的code 后端拿到code后,会在cookie注入老系统的登录态SESSIONID,实现免登录。

核心代码

<iframe
	:src="iframeurl"
	sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-modals"
	allow="payment"
	frameborder="0"
	orgin="*"
	width="100%"
></iframe>
// oldSystemUrl.html 后端指定的跳转中间页 code 后端接口返回,targetUrl目标页面
iframeurl = `oldSystemUrl.html?code=${code}&requestUrl=${targetUrl}`
遇到的问题以及解决方案:

1、通过iframe嵌套的老系统页面无法登录,但是通过浏览器地址栏输入url访问能正常登录

观察发现虽然cookie有正常写入,但是通过iframe嵌套的页面,访问请求接口的过程中并未携带cookie;后经查资料发现,原因是没有显式设置cookie的samesite属性,导致被默认为Lax; 设置samesite属性值为NONE

2、谷歌浏览器无痕模式下Cookie无法写入

谷歌浏览器在设置中修改 # Cookie 及其他网站数据#允许所有Cookie

引用知识点

iframe

HTML内联框架元素,它能够将另一个 HTML 页面嵌入到当前页面中。

参考:developer.mozilla.org/zh-CN/docs/…

SameSite属性

SameSite 是 HTTP 响应头Set-Cookie的属性之一。它允许您声明该 Cookie 是否仅限于第一方或者同一站点上下文。

SameSite 接受下面三个值:

Lax: Cookies 允许与顶级导航一起发送,并将与第三方网站发起的 GET 请求一起发送。这是浏览器中的默认值。

Strict: Cookies 只会在第一方上下文中发送,不会与第三方网站发起的请求一起发送。

None: Cookie 将在所有上下文中发送,即允许跨站发送。

SameSite=None 需要 Secure;否则控制台会报警告

Set-Cookie: flavor=choco; SameSite=None; **Secure**

需要注意的是:

Secure cookie 仅通过 HTTPS 协议加密发送到服务器。请注意,不安全站点(http:)无法使用 Secure 指令设置 cookies。