Змусити Axios надсилати файли cookie у своїх запитах автоматично


121

Я надсилаю запити від клієнта на мій сервер Express.js за допомогою Axios.

Я встановлюю cookie на клієнті і хочу прочитати це cookie з усіх запитів Axios, не додаючи їх вручну, щоб запитувати вручну.

Це приклад мого клієнтського запиту:

axios.get(`some api url`).then(response => ...

Я намагався отримати доступ до заголовків або файлів cookie, використовуючи ці властивості на своєму сервері Express.js:

req.headers
req.cookies

Жоден із них не містив жодного печива. Я використовую проміжне програмне забезпечення для аналізу файлів 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.


1
як ви встановили печиво на клієнта? показати приклад коду, будь ласка :)
Tzook Bar Noy

@TzookBarNoy Доданий код, про який йде мова
Кунок

Файли cookie встановлюються серверами із Set-Cookie, а не клієнтом, я думаю, ви маєте на увазі читання файлу cookie у клієнта. Відповідно до протоколу Cookie, клієнт повинен включати заголовок Cookie у свої запити на сервер видавця файлів cookie.
Ганс Поо

Відповіді:


241

У мене була така ж проблема і виправлено її за допомогою withCredentialsвласності.

XMLHttpRequest з іншого домену не може встановити значення файлів cookie для свого власного домену, якщо для параметраCCentientials не встановлено значення true перед поданням запиту.

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

8
Якщо ви намагаєтеся підключитися до програми Express, вам знадобиться скористатися цими налаштуваннями. Походження запиту обов'язкове. app.use (cors ({облікові дані: true, походження: ' localhost: 8080 '}));
DogCoffee

17
зауважте, що це буде працювати лише тоді, коли Access-Control-Allow-Originзаголовок відповіді не буде встановлено на підстановку (*)
Джеррі Чжан

1
@JerryZhang Що ти маєш на увазі? Я зіткнувся з тією ж проблемою, якщо Access-Control-Allow-Originїї не встановлено *, я не буду надсилати запит на цей сервер через право CORS
samayo

5
Для відповіді потрібно встановити Access-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
Джеррі Чжан

У мене є невелика проблема з цим ... якщо у мене є сервер b як клієнт (т. Е. Сторінка реакції), ніж якщо я встановив це як true, він надсилає облікові дані, а не b-облікові дані ... LOL. .. Добре, це не смішно.
golddragon007

24

TL; DR:

{ withCredentials: true } або axios.defaults.withCredentials = true


З документації axios

withCredentials: false, // default

withCredentials вказує, чи потрібно надсилати запити на контроль між доступом через веб-сайт за допомогою облікових даних

Якщо ви перейдете { withCredentials: true }зі своїм запитом, він повинен працювати.

Кращим способом було б встановлення, withCredentialsяк trueвaxios.defaults

axios.defaults.withCredentials = true


5
Надсилання облікових даних з кожним запитом - погана практика. Ці елементи контролю існують з причини. Якщо розмовляти з іншою службою, відправка всіх ваших файлів cookie - не використовуються вони, дозріла для експлуатації.
colm.anseo

2
@colminator буде надіслано лише куки, які мають домен сервера як їх домен. (За замовчуванням вони не надсилатимуться ні в якісь піддомени, і може бути подальша фільтрація на основі шляху.) Насправді ми надсилаємо лише кукі-сервери, встановлені сервером.
M3RS

15

Я не знайомий з Axios, але, наскільки я знаю, у javascript та ajax є варіант

withCredentials: true

Це автоматично відправить файл cookie на сторону клієнта. Як приклад, цей сценарій також генерується за допомогою passportjs, який встановлює cookie на сервері


11

Також важливо встановити необхідні заголовки в експрес-відповіді. Це ті, які працювали на мене:

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();
});

Додавання X-PINGOTHERв Access-Control-Allow-Headersмене було обов'язковим (Node.js 6.9 з Express 4.16, Chrome 63). Перевірте публікацію JakeElder в цьому випуску GitHub: github.com/axios/axios/isissue/191#issuecomment-311069164
Frosty Z


5

для людей, які ще не в змозі це вирішити, ця відповідь мені допомогла. відповідь stackoverflow: 34558264

TLDR; потрібно встановити {withCredentials: true}як GET-запит, так і POST-запит (отримання файлу cookie) для обох axios, а також для отримання.


1
Це є вирішальним. Я проігнорував це в своєму коді і витратив багато часу, цікавлячись, чому { withCredentials: true }запит GET не вплинув.
йогмк

1
НАЙКРАЙНО важливо! Існує багато дискусій щодо додавання withCredentials: trueдо конфігурації запиту, але не ця деталь. Я витратив майже 2 дні, намагаючись вирішити проблему, поки не натрапив на це
Р. Антао,

4

Як змусити Axios автоматично надсилати файли cookie у запитах?

набір axios.defaults.withCredentials = true;

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

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

наприклад: якщо ваш передній, який робить запит, працює на localhost: 3000, то встановіть заголовок відповіді як

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

також встановити

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

3

Ви можете використовувати withCredentialsвластивість для передачі файлів cookie у запиті.

axios.get(`api_url`, { withCredentials: true })

Встановивши, { withCredentials: true }ви можете зіткнутися з проблемою перехресного походження. Для вирішення цього вам потрібно скористатися

expressApp.use(cors({ credentials: true, origin: "http://localhost:8080" }));

Тут ви можете прочитати про withCredentials


2

У вас два думки змішані.

У вас є "react-cookie" та "axios"

react-cookie => - це обробка файлів cookie на стороні клієнта

axios => призначений для надсилання запитів ajax на сервер

З цією інформацією, якщо ви хочете, щоб файли cookie з боку клієнта також надходили на стороні резервного копіювання, вам потрібно буде з'єднати їх разом.

Примітка з "Реакції-cookie" Readme:

Ізоморфне печиво!

Щоб мати доступ до файлів cookie користувачів під час серверної візуалізації, ви можете використовувати plugToRequest або setRawCookie.

посилання на readme

Якщо це те, що вам потрібно, чудово.

Якщо ні, будь ласка, прокоментуйте, щоб я міг детальніше розробити.


Що plugToRequestсаме робить? Я думав отримати доступ до файлів cookie на сервері вузлів, все, що потрібно - це cookie-parserпроміжне програмне забезпечення (якщо припустити Express)?
геобой

2

Тож у мене виникла така сама проблема, і я втратив близько 6 годин свого життя в пошуках, у мене був

withCredentials: true

Але браузер все одно не зберігав файл cookie, поки з якихось дивних причин у мене не виникла ідея перетасувати налаштування конфігурації:

Axios.post(GlobalVariables.API_URL + 'api/login', {
        email,
        password,
        honeyPot
    }, {
        withCredentials: true,
        headers: {'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json'
    }});

Здається, вам завжди слід надіслати ключ "withCredentials" спочатку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.