V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
drymonfidelia
V2EX  ›  程序员

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

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

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

    console 里面也没报错,就是不发 cookies 。
    9 条回复    2024-10-05 15:25:38 +08:00
    ShuWei
        1
    ShuWei  
       2 天前
    这个问题的原因在于浏览器的跨域策略和 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
        2
    lisongeee  
       2 天前
    感觉楼上的 AI 回复和 OP 主题描述里的《问了几次 GPT4 和 Claude 都在扯别的,就是不提重点,也没查到文档》没啥区别

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

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

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

    淘宝现在好像是登录后给几个域名都写了 Cookie ,之前有一段时间是需要跳转的。具体怎么实现的,暂时还没去了解。
    Livid
        6
    Livid  
    MOD
       1 天前
    @drymonfidelia 谢谢,1 楼的账号已经被彻底 ban 。
    Charrlles
        7
    Charrlles  
       1 天前 via iPhone
    带不带 Cookie 和 cross origin access control 没什么关系,和 cookie 自己的 domain 和 path 有关
    lcy630409
        8
    lcy630409  
       1 天前
    不要质疑大厂技术的选型 肯定是有原因的,
    如果你们站点很多,干脆专门做一个会员中心,像 dz 一样,还是得搞异步轮询登录
    hzzhzzdogee
        9
    hzzhzzdogee  
       1 小时 52 分钟前
    cors 和 cookie 是两个东西
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1981 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:18 · PVG 17:18 · LAX 02:18 · JFK 05:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.