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

请教关于 CORS 中 Access-Control-Allow-Credentials 的问题

  •  
  •   ppy · 2017-02-15 15:11:29 +08:00 · 15631 次点击
    这是一个创建于 2836 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在后端代码在响应头中设置了

    Access-Control-Allow-Credentials : true
    Access-Control-Allow-Origin:*
    

    按照 CORS 的规则: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS#附带凭证信息的请求 ,这个响应应该会失败。

    但实际上结果是这样的

    Access-Control-Allow-Credentials:true
    Access-Control-Allow-Origin:*
    Connection:keep-alive
    Content-Length:2514
    Content-Type:application/json
    
    

    响应也成功了。

    请大佬指教- -

    第 1 条附言  ·  2017-02-15 15:58:55 +08:00
    - -是我对 CORS 认识不清,在开发的过程中,前端启用了 chrome 的 disable-web-security 的设置。

    开发完成以后我部署到线上环境,前后端是同一个 host 所以不存在跨域的问题,所以这个 Access-Control-Allow-Credentials 和 Access-Control-Allow-Origin 的设置也就没有意义了
    9 条回复    2018-12-12 01:30:50 +08:00
    ferrum
        1
    ferrum  
       2017-02-15 15:15:43 +08:00 via iPhone
    不太懂在问什么,但后端设置了这样的 header ,跨域请求时, withCredentials 为 true 的请求应该会带上 cookies 的。
    Arrowing
        2
    Arrowing  
       2017-02-15 15:16:25 +08:00
    如果是需要带 cookie 等验证信息的请求,请加上
    xhrFields: {
    withCredentials: true
    }
    参数,参照 jQuery1.5.1+的文档

    http://www.css88.com/jqapi-1.9/jQuery.ajax/
    ppy
        3
    ppy  
    OP
       2017-02-15 15:22:55 +08:00
    @ferrum 目的是想通过 CORS 的规则,让前端请求接口的时候带上 cookies ,所以设置了 Access-Control-Allow-Credentials : true 这样的响应头,同时之前设置的 Access-Control-Allow-Origin:*。这里按照文档应该会导致前端的这次请求失败,但结果是没有。

    withCredentials:true 是 jq 里面请求带上验证信息,这我知道。
    ppy
        4
    ppy  
    OP
       2017-02-15 15:25:23 +08:00
    @Arrowing 嗯 withCredentials: true 前端这样设置了,的确将 cookies 信息传递上来了,但我困惑的是 CORS 规则里面说到:给一个带有 withCredentials 的请求发送响应的时候, 服务器端必须指定允许请求的域名,不能使用'*'.如果响应头是这样的:Access-Control-Allow-Origin: * ,则响应会失败.
    ferrum
        5
    ferrum  
       2017-02-15 15:37:56 +08:00
    噢,这个问题我以前也遇到过,正常情况下,浏览器会把响应拦截了,你是通过浏览器访问的吗,还是浏览器做了如 Chrome 的 disable-web-security 的设置?
    ppy
        6
    ppy  
    OP
       2017-02-15 15:56:25 +08:00
    @ferrum Chrome 的 disable-web-security 的设置。
    哦你这么一说这个设置我知道为什么我会困惑了,其实没有发生跨域的问题。

    服务端这么设置了,前端开发的时候使用了 Chrome 的 disable-web-security 的设置,所以浏览器没有拦截响应。

    而我访问已经上线的前端页面时,因为前后端都是部署在同一个 host 上的所以不存在跨域的问题。

    那我还想在问一个问题,前端在本地开发的时候,会跨域,服务端的 Access-Control-Allow-Origin 应该如何设置呢,
    前端的文件在浏览器都是电脑内文件的地址。
    cfy
        7
    cfy  
       2017-02-15 16:32:38 +08:00
    我最近也遇到 CORS 的问题,

    如果服务端是 Nginx 的话,可以参考 https://gist.github.com/pauloricardomg/7084524

    if ($http_origin ~* ( https?://.*\.example\.com(:[0-9]+)?$)) {
    add_header Access-Control-Allow-Origin: $http_origin;
    }
    ppy
        8
    ppy  
    OP
       2017-02-16 09:20:59 +08:00
    @cfy 嗯 还可以这样在 nginx 中设置 这样可以把跨域的设置从代码中解耦出来 涨姿势了。
    734695609
        9
    734695609  
       2018-12-12 01:30:50 +08:00
    @cfy 同一 IP 的不同端口也是跨域的。
    针对你的这句话:而我访问已经上线的前端页面时,因为前后端都是部署在同一个 host 上的所以不存在跨域的问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3592 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:19 · PVG 12:19 · LAX 20:19 · JFK 23:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.