第三方Cookie被浏览器拦截了怎么办?
我在做嵌入式Widget开发,主站A要嵌入到第三方网站B的iframe里,需要读取之前在A站设置的Cookie来识别用户。但最近Chrome和Safari直接不发这个Cookie了,导致用户状态丢失。
我试过给Cookie加SameSite=None; Secure,也确认了域名是HTTPS,但还是不行。是不是现在第三方Cookie默认就被禁了?有没有其他办法能跨站保持登录状态?
document.cookie = "user_token=abc123; Domain=.example.com; Path=/; SameSite=None; Secure";
几个可行的替代方案:
方案一:CNAME把第三方域名变成第一方
这是最干脆的办法。把B站嵌入的iframe域名(比如widget-a.example.com)通过CNAME解析到主站A的域名(比如www.example.com),或者反过来让A站域名解析到B站。这样Cookie就变成第一方Cookie了,浏览器不会拦截。代价是要改DNS配置。
方案二:postMessage通信
让第三方网站B通过window.postMessage把domain信息发给A站的iframe,A站后端根据这个信息查表获取用户状态。不需要Cookie了,直接走接口。但这种方式需要B站配合改代码。
方案三:后端Session中转
用户登录时在A站域名下生成session,第三方iframe加载时先调用A站的后端接口,后端根据请求的Origin判断是否允许访问,返回用户信息。这样完全绕过Cookie。
方案四:Storage Access API
Safari支持的比较积极,Chrome也开始支持了。代码大概是:
但这个需要用户主动授权,体验不太好,而且只有部分浏览器支持。
我的建议: 优先看能不能CNAME,这是改动最小效果最好的方案。如果域名不能改,就走postMessage或者后端接口中转。第三方Cookie被淘汰是早晚的事,劝你早点迁移方案。