$ http-запрос не отправляет cookie файлы в домене angular CORS
Прежде всего, я хочу сказать, что я прочитал все вопросы из Stack и все, что связано с CORS, но реализация по-прежнему не работает. Мой APP построен поверх angular crud demo:
Итак, у меня есть в app config:
$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
Итак, 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/
Что мне не хватает?
Ответы
Ответ 1
Вы видели это? Связь между AngularJS и веб-сервисом Jersey, которые находятся в другом домене. Не удается получить доступ к правильной сессии
Попробуйте передать объект конфигурации в $http, который указывает withCredentials, который должен работать во всех версиях.
$http({withCredentials: true, ...}).get(...)
И обсуждение здесь: https://github.com/angular/angular.js/pull/1209
Ответ 2
Настройка withCredentials=true
должна работать, и, в частности, часть, в которой она работает с $ajax, раздражает. Это заставляет меня думать, что проблема не в клиенте, а в сочетании того, что сервер отправляет обратно и как вы его тестируете.
Вы уверены, что тестируете один и тот же путь с помощью jQuery и Angular?
Проблема может быть связана с файлом cookie, который вы возвращаете с сервера. Если путь задан неправильно, браузер не будет отправлять файлы cookie с запросами на другие пути. Это относится и к другим свойствам, но путь скорее всего.
Это будет несовместимо с конфигурацией Angular, но тем не менее она может отбросить вас на несколько часов.
Кроме того, единственное вероятное объяснение заключается в том, что вы используете старую версию Angular, но с учетом детали вашего вопроса и ссылок на другие ответы, которые мне кажутся маловероятными.
Ответ 3
Я вижу два разных поддомена.
- admin.vibetrace.com
- app.vibetrace.com
Попробуйте явно указать cookie для вашего основного домена:
Set-Cookie:vibetrace.ssid=...; Domain=.vibetrace.com; Path=/; Expires=...
Ссылка: Википедия: HTTP Cookie - домен и путь