$ http请求不会在angular度CORS中跨域发送cookie
首先我想告诉我已经阅读了Stack的所有问题以及与CORS相关的所有问题,但是实现仍然不起作用。 我的APPbuild立在angular度粗暴的演示之上:
所以我有在应用程序configuration:
$httpProvider.defaults.useXDomain = true; $httpProvider.defaults.withCredentials = true; delete $httpProvider.defaults.headers.common['X-Requested-With'];
我知道他们正确设置(debugging)。 在我的“安全”应用程序中,我正在为当前用户请求跨域:
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
所以Set-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/
我错过了什么?
你见过这个吗? AngularJS和Jersey Webservice之间在不同域上的通信。 无法访问正确的会话
尝试传递一个configuration对象到$ http指定withCredentials,这应该在所有版本中工作。
$http({withCredentials: true, ...}).get(...)
和这里的讨论: https : //github.com/angular/angular.js/pull/1209
设置withCredentials=true
应该工作,特别是它与$ ajax一起工作的部分是令人烦恼的。 这让我相信这个问题不在客户端,而是在服务器发送回来以及如何testing它的组合中。
你确定你正在使用jQuery和Angular进行相同的testing吗?
问题可能与您从服务器获取的cookie有关。 如果path设置不正确,浏览器将不会将包含请求的cookie发送到其他path。 这也适用于其他属性,但path是最有可能的。
这与Angularconfiguration无关,但它可能会让你回到几个小时。
除此之外,唯一可能的解释是您使用的是Angular的旧版本,但是给出了您的问题的详细信息以及其他对我来说不太可能的答案。
我看到两个不同的子域名。
- admin.vibetrace.com
- app.vibetrace.com
尝试明确地为您的主域设置cookie:
Set-Cookie:vibetrace.ssid=...; Domain=.vibetrace.com; Path=/; Expires=...
参考: 维基百科:HTTP Cookie – 域和path
- 如何使用ui-router为AngularJS提取查询参数?
- 使用本地策略的CORS将客户端应用程序authentication为REST API
- Angular和$ cookies – $ cookies.get不是一个函数
- 如何在Angular中使用$ rootScope来存储variables?
- 将variables传递给Angular Directive
- 没有定义angular度返回模块中的testing服务
- 使用AngularJS和$ resource保存新模型
- Angularjs:'controller as syntax'和$ watch
- Angular和UI-Router,如何设置一个dynamic的templateUrl