为什么从 a.zzz.com 请求 b.zzz.com ,用 credentials: 'include' 可以拿到登录状态,从 xxx.com 请求 b.zzz.com 就拿不到?已设置 access-control

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

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

console 里面也没报错,就是不发 cookies 。
1611 次点击
所在节点   程序员  程序员
10 条回复
ShuWei
ShuWei
160 天前
这个问题的原因在于浏览器的跨域策略和 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.comhttps://b.zzz.com )。浏览器只在特定情况下允许带上身份信息,不能与允许所有来源的设置结合使用。

解决方案:

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

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

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

另外感觉每天都能看到这种简单描述但是不给详细日志的问题,然后楼下一堆 AI 回复和其他人靠猜的回复
drymonfidelia
drymonfidelia
160 天前
@Livid #1 粘贴 AI 无关回复
drymonfidelia
drymonfidelia
160 天前
@lisongeee #2 就是从 a.zzz.com 发跨域请求到 b.zzz.com ,请求头中是有 cookies 的,但从另一个顶级域名发跨域请求,请求头就没有 cookies 。请求 payload 是完全一致的。具体报文指什么,用抓包工具抓的么,还是 XHR
Oktfolio
Oktfolio
160 天前
Chrome:这都是为你们安全着想啊

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

淘宝现在好像是登录后给几个域名都写了 Cookie ,之前有一段时间是需要跳转的。具体怎么实现的,暂时还没去了解。
Livid
Livid
160 天前
@drymonfidelia 谢谢,1 楼的账号已经被彻底 ban 。
Charrlles
Charrlles
160 天前
带不带 Cookie 和 cross origin access control 没什么关系,和 cookie 自己的 domain 和 path 有关
lcy630409
lcy630409
159 天前
不要质疑大厂技术的选型 肯定是有原因的,
如果你们站点很多,干脆专门做一个会员中心,像 dz 一样,还是得搞异步轮询登录
hzzhzzdogee
hzzhzzdogee
158 天前
cors 和 cookie 是两个东西
cat1879
cat1879
158 天前
这不就是跨域的问题吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1077498

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX