Angularjs $ http, похоже, не понимает «Set-Cookie» в ответе

У меня есть nodejs express REST api с модулем Passport для аутентификации. Метод входа (GET) возвращает куки-файл в заголовке. Когда я вызываю его из Chrome, он отлично работает, мой файл cookie установлен в моем браузере.

Но если я позвоню через $ http из Angularjs, cookie не будет установлен.

Set-Cookie:connect.sid=s%3Ad7cZf3DSnz-IbLA_eNjQr-YR.R%2FytSJyd9cEhX%2BTBkmAQ6WFcEHAuPJjdXk3oq3YyFfI; Path=/; HttpOnly 

Как вы можете видеть выше, Set-Cookie присутствует в заголовке ответа службы http.

Возможно, HttpOnly может быть источником этой проблемы? Если да, то как я могу его изменить? Вот моя express-конфигурация:

 app.configure(function () { app.use(allowCrossDomain); app.use(express.bodyParser()); app.use(express.cookieParser()) app.use(express.session({ secret: 'this is a secret' })); app.use(flash()); //passport init app.use(passport.initialize()); app.use(passport.session()); app.set('port', process.env.PORT || 8080); }); 

спасибо за помощь

Обязательно настройте свой запрос $ http для использования учетных данных. Из документации XHR:

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

Наиболее интересной возможностью, предоставляемой как XMLHttpRequest, так и Access Control, является возможность делать «учетные» запросы, которые осведомлены о HTTP-файлах cookie и HTTP-аутентификации. По умолчанию в межсайтовых вызовах XMLHttpRequest браузеры не будут отправлять учетные данные. Определяемый флаг должен быть установлен в объекте XMLHttpRequest при его вызове.

Вы можете использовать объект options для установки использования учетных данных, см.

http://docs.angularjs.org/api/ng.$http

Пример:

 $http({withCredentials: true, ...}).get(...) 

Как вы проверяете наличие cookie?

$http – это всего лишь shell $.ajax браузера, как и jQuery $.ajax и друзья. Это означает, что ваш браузер будет обрабатывать cookies в обычном режиме.

Я предполагаю, что cookie настроен, но вы пытаетесь прочитать его через document.cookie . HttpOnly предотвращает доступ скрипта к файлу cookie. Это хорошая вещь.

HttpOnly помогает смягчить атаки XSS. Это делает невозможным, чтобы вредоносный скрипт украл токен сеанса пользователя (и, следовательно, их логин). Не выключайте HttpOnly .

В любом случае, вам не нужно будет куки. Поскольку $http – это всего лишь shell вокруг XHR, браузер автоматически отправит cookie при следующем запросе. Вы можете проверить это, просмотрев запросы на панели «Инструменты разработчика».

Я решил проблему, установив {withCredential : true} в угловом запросе $http и установив:

 res.header("Access-Control-Allow-Credentials", true); 

в конфигурации моего express-сервера. Делая это, мой файл cookie появляется в списке файлов cookie браузера.

Вы можете изменить его, настроив express.session :

 app.use(express.session({ secret : 'this is a secret', cookie : { httpOnly : false, maxAge : XXX // see text } }); 

Но я не думаю, что Angular много заботится о файлах cookie, которые обрабатываются браузером (и я согласен с @ josh3736, что вы должны поддерживать httpOnly в true ).

Это может иметь какое-то отношение к вашим куки-файлам (браузеру). Вы можете попробовать и посмотреть, работает ли он лучше, явно установив maxAge для файла cookie (в миллисекундах).

  • разгрузка кода / модhive
  • Как развернуть узловое приложение, которое использует grunt для heroku
  • Как изменить значение process.env.PORT в node.js?
  • Как настроить SSL-сертификат для сервера express.js?
  • Как использовать глобальную переменную в node.js?
  • Как изменить папку компонентов по умолчанию для bower?
  • Как установить часовой пояс по умолчанию в node.js?
  • Почему рекомендуется не закрывать соединение MongoDB нигде в коде Node.js?
  • Почему вы не можете изменять данные, возвращаемые Mongoose Query (например: findById)
  • Укажите путь к node_modules в package.json
  • Как вернуть результаты Mongoose из метода поиска?
  • Interesting Posts
    Давайте будем гением компьютера.