Подтвердить что ты не робот

Сделать Axios автоматически отправлять файлы cookie в свои запросы

Я отправляю запросы от клиента на свой сервер 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 в запросы?

Edit:

Я устанавливаю 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.

4b9b3361

Ответ 1

У меня была та же проблема и исправлена ​​ее withCredential свойство.

XMLHttpRequest из другого домена не может устанавливать значения файлов cookie для своего собственного домена, если только для параметра Credentials не установлено значение true.

axios.get('some api url', {withCredentials: true});

Ответ 2

Я не знаком с Axios, но насколько я знаю в javascript и ajax, есть опция

withCredentials: true

Это автоматически отправит файл cookie на стороне клиента. В качестве примера этот сценарий также генерируется с помощью паспортных данных, который устанавливает cookie на сервере

Ответ 3

Также важно установить необходимые заголовки в экспресс-ответе. Это те, которые работали для меня:

app.use(function(req, res, next) {
  res.header('Access-Control-Allow-Origin', yourExactHostname);
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
  next();
});

Ответ 4

Другим решением является использование этой библиотеки:

https://github.com/3846masa/axios-cookiejar-support

который интегрирует поддержку "Tough Cookie" в Axios. Обратите внимание, что для этого подхода по-прежнему требуется флаг withCredentials.

Ответ 5

Из документации Axios

withCredentials: false,//по умолчанию

withCredentials указывает, должны ли межсайтовые запросы Access-Control быть сделаны с использованием учетных данных

Если вы передадите { withCredentials: true } с вашим запросом, он должен работать.

Лучшим способом было бы установить withCredentials как true в axios.defaults

axios.defaults.withCredentials = true

Ответ 6

Вы получаете, что двое думают смешанным.

У вас есть "реакция-cookie" и "axios"

response-cookie = > предназначен для обработки файлов cookie на стороне клиента.

axios = > предназначен для отправки ajax-запросов на сервер

С этой информацией, если вы хотите, чтобы файлы cookie с клиентской стороны также были переданы на стороне бэкэнд, вам нужно будет соединить их вместе.

Примечание из файла "реакция-cookie":

Изоморфные файлы cookie!

Чтобы иметь возможность доступа к куки файлам пользователей при выполнении рендеринга сервера, вы может использовать plugToRequest или setRawCookie.

ссылка на readme

Если это то, что вам нужно, отлично.

Если нет, прокомментируйте, чтобы я мог подробнее рассказать.

Ответ 7

Я в основном работаю над другими вещами, поэтому, возможно, я что-то упустил, но поддержка axios-cookiejar-support не работала в моем приложении узла.

Это делает (отредактировано)

const jar = new CookieJar()  // from tough-cookie
const response = await this.axios(url, config)
const cookie = response.headers["set-cookie"] as string[] | undefined
if (cookie) {
  cookie.forEach(k => jar.setCookieSync(k, this.baseUrl + url))
  this.axios.defaults.headers.Cookie = jar.getCookieStringSync(url)
}

Ответ 8

Как заставить Axios автоматически отправлять файлы cookie в запросах?

set axios.defaults.withCredentials = true;

или для какого-то определенного запроса вы можете использовать axios.get(url,{withCredentials:true})

это даст ошибку CORS, если для вашего Access-Control-Allow-Origin установлено значение подстановочного знака (*). Поэтому не забудьте указать URL происхождения вашего запроса

например: если ваш клиентский интерфейс, выполняющий запрос, работает на localhost: 3000, установите заголовок ответа как

res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');

также установить

res.setHeader('Access-Control-Allow-Credentials',true);

Ответ 9

для людей, которые все еще не могут решить эту проблему, этот ответ помог мне. fooobar.com/info/80868/...

TL;DR; необходимо установить {withCredentials: true} в обоих запросах GET, а также запрос POST (получение cookie) для обеих аксиос, а также для извлечения.