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.
- Как связать переменное количество обещаний в Q, по порядку?
- Синхронные запросы к базе данных с помощью Node.js
- Как обмениваться сеансами с Socket.IO 1.x и Express 4.x?
- Обновление Node.js до последней версии
- Как удалить nodejs, установленный из pkg (Mac OS X)?
Возможно, 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); });
спасибо за помощь
- Сравнение mongoose _id и строк
- как создать неблокирующую асинхронную функцию в node.js?
- Как читать из stdin по строкам в узле
- Поток от указателя mongodb до express-ответа в node.js
- Исправление npm-пути в Windows 8 и 10
- Grunt.js: что означает -save-dev в npm install grunt --save-dev
- Как передать аргументы командной строки программе Node.js?
- Ошибка: шаг «brew link» не завершился успешно
Обязательно настройте свой запрос $ 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 (в миллисекундах).