跨多域名SSO实现:模仿Google跨域设置Cookie的技术咨询
首先得明确一个核心点:浏览器的同源策略不允许直接从A域名向完全不同的B域名设置Cookie——这也是你用XMLHttpRequest()失败的原因,哪怕配置了CORS,跨顶级域名的Cookie设置也会被浏览器拦截。而你用新标签页打开B域名能成功设置Cookie,是因为此时浏览器是直接访问B域名的资源,由B域名的服务器返回Set-Cookie头,完全符合同源规则。
Google的流程本质就是利用了浏览器的跳转行为来绕开这个限制,具体实现思路如下:
1. 复刻Google的跳转流程
你需要设计一个两步跳转的逻辑:
- 第一步:从主域名触发跳转
当用户在你的主域名(类似google.com)执行操作时,请求主域名的一个接口(比如/SetOSID),这个接口不需要设置Cookie,而是直接返回302 Found重定向到目标域名(类似youtube.com)的Cookie设置接口,同时带上必要的参数(比如身份验证信息、跳转回主域名的回调地址)。 - 第二步:目标域名设置Cookie并回调
目标域名的接口(比如/SetSID)接收到请求后,验证参数的合法性,然后在响应头里添加Set-Cookie(注意要把domain属性设置为目标域名,比如.your-target-domain.com,确保子域名也能访问),最后再返回302 Found重定向回主域名的回调页面,完成整个流程。
2. 关键配置细节
- Cookie的
Set-Cookie头规则
目标域名的服务器返回的Set-Cookie必须符合规范:set-cookie: _your-cookie=value; Path=/; Domain=.your-target-domain.com; HttpOnly; SecureDomain要明确设置为目标域名的根域(带前缀.),这样该域名下的所有子域名都能共享这个Cookie;Secure属性建议加上,确保Cookie只在HTTPS请求中传输;HttpOnly可以防止前端JS读取Cookie,提升安全性。
- 跳转的参数传递
主域名跳转到目标域名时,需要传递足够的验证信息(比如加密后的身份凭证),确保目标域名能确认请求的合法性,避免恶意设置Cookie。回调地址也要通过参数传递,方便目标域名完成Cookie设置后跳回主域名。
3. 为什么你的XHR尝试会失败?
浏览器对跨域XHR的Cookie操作有严格限制:
- 即使你在XHR中设置了
withCredentials: true,并且服务器配置了Access-Control-Allow-Credentials: true,也只能在同一父域的域名间共享Cookie(比如a.your-domain.com和b.your-domain.com); - 对于像google.com和youtube.com这种完全独立的顶级域名,跨域XHR请求中返回的
Set-Cookie会被浏览器直接忽略,这是同源策略的安全限制,无法绕过。
针对你当前实操的调整建议
你当前的响应是在mysite.ngrok.io域名下设置Cookie,如果要给另一个域名设置Cookie,需要:
- 修改主域名的接口,让它302跳转到目标域名的Cookie设置接口;
- 在目标域名的接口中返回带有正确
Domain属性的Set-Cookie头; - 目标域名接口完成Cookie设置后,再跳回你的主域名回调地址。
控制台显示请求类型为binary对你的需求没有影响,不用在意这个点。
内容的提问来源于stack exchange,提问作者Sharuk Ahmed
相关产品推荐
相关产品推荐

