Jquery $http请求不';t在角CORS中跨域发送cookies

Jquery $http请求不';t在角CORS中跨域发送cookies,jquery,angularjs,cors,Jquery,Angularjs,Cors,首先,我想说的是,我已经阅读了Stack中的所有问题以及与CORS相关的所有内容,但是实现仍然不起作用。我的应用程序建立在以下基础之上: 因此,我在应用程序配置中: $httpProvider.defaults.useXDomain = true; $httpProvider.defaults.withCredentials = true; delete $httpProvider.defaults.headers.common['X-Requested-With']; 我知道它们已正确设置(

首先,我想说的是,我已经阅读了Stack中的所有问题以及与CORS相关的所有内容,但是实现仍然不起作用。我的应用程序建立在以下基础之上:

因此,我在应用程序配置中:

$httpProvider.defaults.useXDomain = true;
$httpProvider.defaults.withCredentials = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
我知道它们已正确设置(通过调试)。在我的“安全”应用程序中,我正在为当前用户跨域请求:

return $http.get(LAYOUT_CONFIG.baseURL + '/current-user').then(function(response) {
      //service.currentUser = response.data.user;
      service.currentUser = response.data;
      return service.currentUser;
    });
我在第一次请求时获得以下标题:

    Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:accept, origin, content-type, cookie
Access-Control-Allow-Methods:GET,POST
Access-Control-Allow-Origin:http://admin.vibetrace.com
Access-Control-Max-Age:1728000
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Sun, 02 Jun 2013 11:07:49 GMT
P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server:nginx/1.1.19
Set-Cookie:vibetrace.ssid=s%3A2lT2_N0-EevCJt7LbRlJ6Az1.d8xp99st%2F0RNV0VN2D4o4AJXNRT%2F%2F46v8PDVWSAbx%2Fw; Path=/; Expires=Mon, 30 Sep 2013 11:07:49 GMT
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Cache:MISS
X-Powered-By:Express
所以,设置Cookie就在那里。但是,随后的$http.get请求(来自angular)不会发送之前应该设置的cookie

Accept:application/json, text/plain, */*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Host:app.vibetrace.com
Origin:http://admin.vibetrace.com
Pragma:no-cache
Referer:http://admin.vibetrace.com/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36
但有趣的部分来了。如果我在控制台中运行以下代码:

$.ajax("https://app.vibetrace.com/current-user", {
            type: "GET",
            success: function(data, status, xhr) {               
            },
            xhrFields: {
                withCredentials: true
            },
            crossDomain: true
        });
请求头包含cookie

Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Cookie:fbm_245656478789760=base_domain=.vibetrace.com; __utma=199448574.828439508.1336934706.1361539088.1361819816.356; __utmc=199448574; __utmz=199448574.1361819816.356.354.utmcsr=tenlister.com|utmccn=(referral)|utmcmd=referral|utmcct=/index.php; connect.sid=s%3AZ1o9bIw0jBOmQwuhKJDG1San.%2BfshIsvupiRuK0pUJqm8EAMnMBCyxf%2Fk17cAVzcy31w; __utma=173003172.1796845739.1355503443.1369827921.1369833348.68; __utmc=173003172; __utmz=173003172.1369410587.66.5.utmcsr=stage.marketizator.com|utmccn=(referral)|utmcmd=referral|utmcct=/app/builder/; vibetrace.ssid=s%3AV6biojefu9r5DTGErKL5vYPi.KAlnWMUm8jZmPV0MpP%2FrgqwmkF6WuXEZZDyzJhozYCs
Host:app.vibetrace.com
Origin:http://admin.vibetrace.com
Pragma:no-cache
Referer:http://admin.vibetrace.com/
我错过了什么?你看到这个了吗

尝试将一个配置对象传递给$http,该对象指定了withCredentials,它应该在所有版本中都能工作


这里的讨论是:

设置
withCredentials=true
应该可以工作,尤其是它与$ajax一起工作的部分令人烦恼。这让我相信问题不在于客户端,而在于服务器发送回的内容和测试方式的组合

您确定使用jQuery和Angular在同一条路径上进行测试吗

问题可能与从服务器返回的cookie有关。如果路径设置不正确,浏览器将不会将cookie和请求一起发送到其他路径。这也适用于其他属性,但路径是最有可能的

这与角度配置无关,但它可能会让您倒退几个小时


除此之外,唯一可能的解释是,您使用的是Angular的旧版本,但考虑到您的问题的细节以及指向其他答案的链接,我觉得这似乎不太可能。

我看到了两个不同的子域

  • admin.vibetrace.com
  • app.vibetrace.com
尝试显式设置主域的cookie:

Set-Cookie:vibetrace.ssid=...; Domain=.vibetrace.com; Path=/; Expires=...

参考资料:

我认为OP已经完成了他的家庭作业,一定是出了什么问题。不确定是什么,jquery的细节是奇怪的。您的配置在我看来是有效的,我在这里看到的实际区别是我正在处理“选项”请求方法加上允许头:res.header('Access-Control-allow-headers','X-Requested-With,X-HTTP-method-Override,Content-Type,Accept,Authorization');
Set-Cookie:vibetrace.ssid=...; Domain=.vibetrace.com; Path=/; Expires=...