持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
关于前端iframe嵌入第三方页面,且需无感登陆(携带cookie信息)的问题(无法修改第三方源码或增加接口,且无法设置如白名单等)
问题描述
我司最近有个需求,想将confluence的某个详情页嵌入到另一个项目(hn)中去,并且可以实现无感登陆访问。
在网上查阅相关资料后,前端可以使用 serviceWorker来监听项目请求,并对请求做出处理(如:设置请求头等),在将serviceWorker代码写入后,不生效,后发现无法浏览器无法打印出该API。查阅MDN文档后发现,原来是因为hn为公司内部项目,使用的是http协议,serviceworker仅支持https及localhost本地调试环境下使用(进入死路QAQ).
最终也没有解决这个问题。以下为问题总结,仅供参考
问题细化
1、多用户情况下实现免登陆,如何保证使用相同且不过期的cookie?
(无感登陆时,想实现使用同一个账号进行登陆,且多用户访问时,cookie不会失效导致重新登录)
解决方案:后端用统一的账号模拟登陆,并将登陆信息进行缓存,同时要通过定时任务定期更新缓存cookie信息
2、iframe嵌入某些第三方页面时,目标页面的点击劫持的安全策略如何跳过?
(问题描述:点击劫持是指现在的网络环境下,有的网站为了防止其他网站 使用 iframe嵌入自己的网站,使用的安全策略CSP、X-Frame-Options、framekiller,
CSP、X-Frame-Options两者都是服务端通过设置 HTTP 响应头来声明 CSP 和X-Frame-Options)
解决方案:通过nginx做中间代理,对目标页面相应头header进行调整
3、后端将cookie信息返回前端,前端如何携带cookie信息请求第三方目标地址?
暂时无法解决,原因如下:浏览器同源策略,cookie无法跨域设置
可行的解决方案:
1、第三方配合完成,提供设置远程cookie的rest接口。(需第三方配合)
2、主服务和第三方服务用用同一个nginx做代理,保持协议、IP、端口一致,通过location去路由不同的服务。(需第三方配合)
问题总结
1、嵌入同源(相同协议、域名、端口)的某个页面没有问题(即使需要登录,浏览器的同源策略也允许访问cookie)
eg:
即在 网站A 比如 https://a.com/a 中 使用iframe 内嵌访问 网站B 比如 https://b.com/b 会导致 网站B登录失效
如果把 网站B域名改成 https://a.com/b 即在 网站A 比如 https://a.com/a 中 使用iframe 内嵌访问 网站B 比如 https://a.com/b是可以的
2、嵌入第三方无登录页面,如果第三方页面没有登陆,只需解决安全策略即可