Попытка отправить cookie обратно после запроса на вход на сайт моего хобби-проекта. По какой-то причине он работает при локальном запуске, то есть http://localhost:3000. Но как только я запускаю свой API в сети и пытаюсь получить к нему доступ через мой живой веб-сайт, я не вижу файлов cookie в разделе «Приложение» -> «Файлы cookie» -> «Веб-сайт» (используя хром). Я много гуглил и, кажется, поставил галочку перед каждой политикой CORS.
NodeJS работает в AWS lambda и вызывается через API-шлюз. API GW направляется через облачный дистрибутив (если это имеет значение).
В моем экспресс-бэкэнде я соответствующим образом зарегистрировал свои заголовки:
res.cookie('jwt', token, cookieOptions);
console.info('Checking cookie', res);
console.info('Checking cookie', res.cookies);
res.status(statusCode).json({
status: 'success',
data: {
user
}
});
Результат этого частично таков:
'access-control-allow-origin': [ 'Access-Control-Allow-Origin', 'https://example.com' ],
vary: [ 'Vary', 'Origin' ],
'access-control-allow-credentials': [ 'Access-Control-Allow-Credentials', 'true' ],
'access-control-allow-methods':
[ 'Access-Control-Allow-Methods',
'GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS' ],
'access-control-allow-headers':
[ 'Access-Control-Allow-Headers',
'Origin, X-Requested-With, Content-Type, Accept, X-PINGOTHER' ],
'x-ratelimit-limit': [ 'X-RateLimit-Limit', 100 ],
'x-ratelimit-remaining': [ 'X-RateLimit-Remaining', 97 ],
date: [ 'Date', 'Fri, 11 Dec 2020 23:20:28 GMT' ],
'x-ratelimit-reset': [ 'X-RateLimit-Reset', 1607732145 ],
quizappuserloggedin: [ 'QuizAppUserLoggedIn', 'false' ],
'set-cookie':
[ 'Set-Cookie', 'my-cookie'; Path=/; Expires=Sat, 12 Dec 2020 23:20:34 GMT; HttpOnly; Secure'
Из того, что я могу сказать, я правильно установил свои настройки CORS. Из моего интерфейса я установил:
axios.defaults.withCredentials = true;
Из того, что я могу сказать, я сделал все, что мог найти в Установить куки для запросов перекрестного происхождения
Это означает, что я дважды проверил свои настройки cors, и из инструкции печати похоже, что файл cookie отправляется. Но почему браузер его не видит?
Если это поможет, я мог бы опубликовать реальный сайт и репозиторий github, я застрял здесь навсегда.
ОБНОВЛЯТЬ
Я просмотрел заголовки ответов в своем браузере и сравнил их с заголовками в бэкэнд-API. Из этого сравнения я вижу, что мой заголовок «set-cookie» не включен в ответ, хотя я ясно вижу, что он включен в ответ от бэкэнда:
ОБНОВЛЕНИЕ 2
Я считаю, что после дальнейшего расследования я сузил проблему до проблемы CORS с AWS API Gateway. Я изучил их, но все равно не повезло.
Как добавить заголовок CORS в ответ AWS API Gateway с активацией интеграции лямбда-прокси
Шлюз Amazon API игнорирует set-cookie
Журналы из lambda cloudwatch непосредственно перед отправкой ответа экспресс-платформой, а также журналы cloudwatch из шлюза API (заголовки ответов).
Журналы API GW cloudwatch заголовков ответов:
Журналы Lambda cloudwatch объекта ответа, отправленного экспресс-платформой:
Я пытаюсь получить к нему доступ в своем интерфейсе для аутентификации. Чем занимается этот парень: youtube.com/…
Он использует httpOnly
файлы cookie, поэтому он никак не может получить к ним доступ в коде своего внешнего приложения.
«Файл cookie с атрибутом HttpOnly недоступен для JavaScript Document.cookie API; он отправляется только на сервер». developer.mozilla.org/en-US/docs/Web/HTTP/Cookies
Конечно, в этом все дело, он «защищен» от доступа через js. Но мое намерение (или я так думал) заключалось в том, что я создам запрос на вход в систему, получу ответ с файлом cookie, который хранится в браузере, который позже будет автоматически включен в любой запрос, который я делаю для того же домена. Под «доступом» я не имел в виду фактический доступ через код, просто чтобы уточнить.
Да, так и будет, но если вы не увидите его в списке файлов cookie для вашего приложения, которое находится в другом источнике. Файл cookie прикрепляется, когда выполняется запрос к домену, которому принадлежит файл cookie.
Вы обнаружите, что ваш объект запроса при последующих запросах больше не имеет файла cookie?
Ну, куки никогда не появляются в браузере, никогда. Я просто вижу это при локальном запуске интерфейса и API.
Может быть проблема в том, что API работает в API GW, который, в свою очередь, направляется через облачный фронт. Файл cookie каким-то образом «принадлежит» домену api gw или cloudfront, а не моему «веб-сайту»
Важно понимать, что если ваш бэкэнд находится на api.example.com, а ваш интерфейс — на www.example.com, например, вы никогда не увидите файлы cookie api.example.com в своем списке файлов cookie для www.example.com. . Файлы cookie зависят от источника, за исключением отсутствия изоляции портов. Но даже если вы не видите файл cookie api.example.com, он все равно может быть привязан к запросам браузера к этому домену.
Я верю, что понимаю. У меня есть свой веб-сайт по адресу example.com, и любой запрос, сделанный на example.com/api/v1/*, направляется на мой серверный API. Возможно, мне следует просто включить файл cookie в тело и сохранить его в локальном хранилище.
Если вы используете файл cookie HttpOnly, он все равно должен работать из разных источников. Чтобы проверить это, попробуйте изменить локальный сервер или внешний интерфейс на 127.0.0.1, и вы увидите, что файл cookie все еще работает, но не отображается в списке файлов cookie.
Если я изменю свой интерфейс на 127.0.0.1 и вызову API из локального экземпляра, я получу ошибку CORS.
Привет, вы пытались добавить домен в файл cookie; как Домен=${Домен}; здесь домен должен быть доменом вашего приложения или приложение должно находиться в поддомене.
да, я пробовал как на уровне домена, так и на уровне поддомена.
Оказывается, это не проблема CORS. Я просто забыл переслать файлы cookie из моего облачного дистрибутива.
Вы пытаетесь получить доступ к файлу cookie в своем интерфейсном приложении с перекрестным происхождением (т. Е. Во внешнем JS-коде) или вы просто хотите убедиться, что файл cookie возвращается на серверную часть с каждым запросом? Потому что последнее можно сделать, следуя шагам, указанным в предоставленной вами ссылке, но на самом деле внешний код не может получить прямой доступ к файлам cookie другого источника.