Я отправляю запросы от клиента на свой сервер Express.js с помощью Axios.
Я установил файл cookie на клиенте и хочу читать этот файл cookie из всех запросов Axios, не добавляя их вручную в запрос вручную.
Это пример моего клиентского запроса:
axios.get(`some api url`).then(response => ...
Я попытался получить доступ к заголовкам или файлам cookie, используя эти свойства на моем сервере Express.js:
req.headers
req.cookies
Ни один из них не содержал файлов cookie. Я использую промежуточное ПО для парсера файлов cookie:
app.use(cookieParser())
Как заставить Axios автоматически отправлять файлы cookie в запросах?
Редактировать:
Я устанавливаю cookie на клиенте следующим образом:
import cookieClient from 'react-cookie'
...
let cookie = cookieClient.load('cookie-name')
if(cookie === undefined){
axios.get('path/to/my/cookie/api').then(response => {
if(response.status == 200){
cookieClient.save('cookie-name', response.data, {path:'/'})
}
})
}
...
Хотя он также использует Axios, это не имеет отношения к вопросу. Я просто хочу встраивать файлы cookie во все свои запросы после установки файла cookie.
Ответы:
У меня была такая же проблема, и я решил ее с помощью
withCredentials
свойства.XMLHttpRequest из другого домена не может устанавливать значения файлов cookie для своего собственного домена, если для параметра withCredentials не установлено значение true перед выполнением запроса.
источник
Access-Control-Allow-Origin
в заголовке ответа не задан подстановочный знак (*)Access-Control-Allow-Origin
она не настроена,*
это означает, что я не буду делать запрос к этому серверу из-за права CORSAccess-Control-Allow-Origin
значение домена, из которого вы хотите сделать запрос XHR. например,https://a.com
это сервер,https://b.com
это клиент,https://b.com
загружается в чей-то браузер и используетсяXMLHTTPRequest
для отправки запросаhttps://a.com
. В дополнение к настройкеXMLHTTPRequest
(инициированhttps://a.com
)withCredential: true
сервер -https://b.com
также необходимо настроить так, чтобы заголовок ответа содержалAccess-Control-Allow-Origin: https://a.com
TL; DR:
{ withCredentials: true }
илиaxios.defaults.withCredentials = true
Из документации axios
withCredentials
указывает, должны ли запросы управления доступом между сайтами выполняться с использованием учетных данныхЕсли вы пройдете
{ withCredentials: true }
с вашим запросом, он должен работать.Лучше было бы установить
withCredentials
какtrue
вaxios.defaults
источник
Я не знаком с Axios, но, насколько мне известно, в javascript и ajax есть опция
Это автоматически отправит cookie на клиентскую сторону. Например, этот сценарий также создается с помощью паспортаjs, который устанавливает cookie на сервере.
источник
Также важно установить необходимые заголовки в экспресс-ответе. Вот те, которые у меня сработали:
источник
X-PINGOTHER
вAccess-Control-Allow-Headers
было для меня обязательным (Node.js 6.9 с Express 4.16, Chrome 63). Проверьте сообщение JakeElder об этой проблеме на GitHub: github.com/axios/axios/issues/191#issuecomment-311069164Другое решение - использовать эту библиотеку:
https://github.com/3846masa/axios-cookiejar-support
который интегрирует поддержку "Tough Cookie" в Axios. Обратите внимание, что этот подход по-прежнему требует
withCredentials
флага.источник
для людей, которые все еще не могут его решить, этот ответ мне помог. ответ stackoverflow: 34558264
TL; DR; необходимо установить
{withCredentials: true}
как запрос GET, так и запрос POST (получение cookie) для обоих axios, а также для выборки.источник
{ withCredentials: true }
запрос GET не имеет никакого эффекта.withCredentials: true
в конфигурацию запроса, но не об этой детали. Я потратил почти 2 дня, пытаясь решить проблему, пока не наткнулся на этоустанавливать
axios.defaults.withCredentials = true;
или для какого-то конкретного запроса вы можете использовать
axios.get(url,{withCredentials:true})
например: если ваш интерфейс, который выполняет запрос, выполняется на localhost: 3000, установите заголовок ответа как
также установить
источник
Так что у меня была точно такая же проблема, и я потерял около 6 часов своей жизни на поиски, у меня был
withCredentials: true
Но браузер по-прежнему не сохранял файл cookie, пока по какой-то странной причине мне не пришла идея перетасовать настройку конфигурации:
Похоже, вы всегда должны сначала отправлять ключ withCredentials.
источник
Вы можете использовать
withCredentials
свойство для передачи файлов cookie в запросе.При установке
{ withCredentials: true }
вы можете столкнуться с проблемой перекрестного происхождения. Чтобы решить эту проблему, вам нужно использоватьЗдесь вы можете прочитать о withCredentials
источник
Вы путаете эти два мнения.
У вас есть "react-cookie" и "axios"
response-cookie => предназначен для обработки cookie на стороне клиента
axios => предназначен для отправки запросов ajax на сервер
Имея эту информацию, если вы хотите, чтобы файлы cookie со стороны клиента передавались и на стороне сервера, вам нужно будет соединить их вместе.
Примечание из файла Readme "react-cookie":
ссылка на readme
Если это то, что вам нужно, отлично.
Если нет, прокомментируйте, чтобы я мог уточнить детали.
источник
plugToRequest
именно делает? Я думал, что для доступа к файлам cookie на сервере узла все, что нужно, - этоcookie-parser
промежуточное программное обеспечение (при условии, что Express)?