access-control-allow-credentials access-control-allow-origin 都已经设置了。
和第三方 Cookies 有关吗?但是从 a.zzz.com 请求 b.zzz.com 不是也算第三方请求?
问了几次 GPT4 和 Claude 都在扯别的,就是不提重点,也没查到文档。

场景是公司好几个网站都用不同的顶级域名,想实现单点登录,登录的时候像 youtube 一样所有域名全跳一遍体验太糟糕了。

console 里面也没报错,就是不发 cookies 。
举报· 66 次点击
登录 注册 站外分享
3 条回复  
ShuWei 小成 2024-10-3 13:52:52
这个问题的原因在于浏览器的跨域策略和 credentials 处理。具体来说:

        1.        同源策略 (Same-Origin Policy):
当 a.zzz.com 请求 b.zzz.com 时,这两个域名属于同一个主域 (zzz.com),只是子域不同,因此浏览器通常允许共享 cookie 和认证信息(如果服务器允许),而 credentials: 'include' 会确保带上用户的身份认证信息(比如 cookie 或 HTTP 认证头)。
        2.        跨域请求 (CORS):
当从 xxx.com 请求 b.zzz.com 时,这属于不同的主域,跨域请求的处理就不同了。在这种情况下,即使你设置了 Access-Control-Allow-Origin 来允许跨域,浏览器仍然不会自动携带 cookie 或其他认证信息,除非服务器明确允许跨域携带身份认证信息。
        3.        Access-Control-Allow-Credentials:
你提到已经设置了 access-control ,但是要确保你已经正确设置了 Access-Control-Allow-Credentials: true 。这是允许浏览器在跨域请求中携带认证信息的关键标头。如果没有这个标头,浏览器即使带上了 credentials: 'include' 也不会发送或接收身份验证的 cookie 。
        4.        Access-Control-Allow-Origin 的限制:
当你使用 Access-Control-Allow-Credentials: true 时,Access-Control-Allow-Origin 的值不能为通配符 *,而必须是明确的域名(如 https://xxx.com 或 https://b.zzz.com )。浏览器只在特定情况下允许带上身份信息,不能与允许所有来源的设置结合使用。

解决方案:

        •        确保你的服务器在 b.zzz.com 上配置了 Access-Control-Allow-Credentials: true 。
        •        Access-Control-Allow-Origin 必须明确指定为请求的域名,如 https://xxx.com ,不能是 *。
        •        在客户端的请求中使用 credentials: 'include' 以确保跨域请求中包含身份认证信息。

如果你的配置没有问题,检查一下浏览器的开发者工具中的网络请求日志,看看请求和响应的 Access-Control 相关头部是否都符合要求。
lisongeee 小成 2024-10-3 14:09:40
感觉楼上的 AI 回复和 OP 主题描述里的《问了几次 GPT4 和 Claude 都在扯别的,就是不提重点,也没查到文档》没啥区别

建议这种情况 OP 最好给出完整的 HTTP 报文日志,懂的人一看报文就清楚了

另外感觉每天都能看到这种简单描述但是不给详细日志的问题,然后楼下一堆 AI 回复和其他人靠猜的回复
Oktfolio 初学 2024-10-3 14:56:30
Chrome:这都是为你们安全着想啊

Chrome 80 默认 SameSite 为 Lax ,SameSite=None 要求 Secure
Chrome 91 默认阻止第三方 Cookie

淘宝现在好像是登录后给几个域名都写了 Cookie ,之前有一段时间是需要跳转的。具体怎么实现的,暂时还没去了解。
返回顶部