为什么从 a.zzz.com 请求 b.zzz.com ,用 credentials: 'include' 可以拿到登录状态,从 xxx.com 请求 b.zzz.com 就拿不到?已设置 access-control - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
drymonfidelia
V2EX    程序员

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

  •  
  •   drymonfidelia 2024 年 10 月 3 日 2204 次点击
    这是一个创建于 532 天前的主题,其中的信息可能已经有所发展或是发生改变。
    access-control-allow-credentials access-control-allow-origin 都已经设置了。
    和第三方 Cookies 有关吗?但是从 a.zzz.com 请求 b.zzz.com 不是也算第三方请求?
    问了几次 GPT4 和 Claude 都在扯别的,就是不提重点,也没查到文档。

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

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

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

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

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

    淘宝现在好像是登录后给几个域名都写了 Cookie ,之前有一段时间是需要跳转的。具体怎么实现的,暂时还没去了解。
    Livid
        6
    Livid  
    MOD
    PRO
       2024 年 10 月 3 日
    @drymonfidelia 谢谢,1 楼的账号已经被彻底 ban 。
    Charrlles
        7
    Charrlles  
       2024 年 10 月 3 日 via iPhone
    带不带 Cookie 和 cross origin access control 没什么关系,和 cookie 自己的 domain 和 path 有关
    lcy630409
        8
    lcy630409  
       2024 年 10 月 4 日
    不要质疑大厂技术的选型 肯定是有原因的,
    如果你们站点很多,干脆专门做一个会员中心,像 dz 一样,还是得搞异步轮询登录
    hzzhzzdogee
        9
    hzzhzzdogee  
       2024 年 10 月 5 日
    cors 和 cookie 是两个东西
    cat1879
        10
    cat1879  
       2024 年 10 月 5 日
    这不就是跨域的问题吗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1126 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 18:16 PVG 02:16 LAX 11:16 JFK 14:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86