Як надіслати заголовок авторизації з axios


98

Як я можу відправити заголовок автентифікації з маркером через axios.js? Я спробував кілька речей без успіху, наприклад:

const header = `Authorization: Bearer ${token}`;
return axios.get(URLConstants.USER_URL, { headers: { header } });

Видає мені цю помилку:

XMLHttpRequest cannot load http://localhost:8000/accounts/user/. Request header field header is not allowed by Access-Control-Allow-Headers in preflight response.

Мені вдалося змусити його працювати, встановивши загальне значення за замовчуванням, але я думаю, це не найкраща ідея для одного запиту:

axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;

Оновлення:

Відповідь Коула допомогла мені знайти проблему. Я використовую проміжне програмне забезпечення django-cors-headers, яке вже обробляє заголовок авторизації за замовчуванням.

Але я зміг зрозуміти повідомлення про помилку і виправив помилку в коді мого запиту axios, яка мала виглядати так

return axios.get(URLConstants.USER_URL, { headers: { Authorization: `Bearer ${data.token}` } });

Відповіді:


88

На непростих http-запитах ваш браузер спочатку надсилає запит «перед вильотом» (запит методу OPTIONS) для того, щоб визначити, який сайт вважає безпечною для надсилання інформації (див. Тут специфікацію політики щодо перехресного походження щодо цього). Одним із відповідних заголовків, який хост може встановити у передпольоті, є Access-Control-Allow-Headers. Якщо будь-який із заголовків, які ви хочете надіслати, не був перелічений ні в списку специфікацій заголовків білого списку, ні в попередній відповіді сервера, тоді браузер відмовиться відправити ваш запит.

У вашому випадку ви намагаєтеся надіслати Authorizationзаголовок, який не вважається одним із загально безпечних для надсилання заголовків. Потім браузер надсилає попередній запит, щоб запитати сервер, чи повинен він надсилати цей заголовок. Сервер або надсилає порожній Access-Control-Allow-Headersзаголовок (що вважається «не дозволяти зайві заголовки»), або надсилає заголовок, який не входить Authorizationдо списку дозволених заголовків. Через це браузер не збирається надсилати ваш запит, а натомість вирішує повідомити вас, видавши помилку.

Будь-яке обхідне рішення Javascript, яке дозволяє вам надіслати цей запит у будь-якому випадку, слід вважати помилкою, оскільки це суперечить політиці запитів на перехресне походження, яку ваш браузер намагається застосувати для власної безпеки.

tl; dr - Якщо ви хочете надсилатиAuthorizationзаголовки, краще налаштуйте ваш сервер, щоб дозволити це. Налаштуйте свій сервер, щоб він відповідав наOPTIONSзапит за цією URL-адресоюAccess-Control-Allow-Headers: Authorizationзаголовком.


11
Дякую, Коул! Ваша відповідь допомогла мені знайти проблему. Я використовую проміжне програмне забезпечення django-cors-headers, яке вже обробляє заголовок авторизації за замовчуванням. Але я зміг зрозуміти повідомлення про помилку і виправив помилку в коді мого запиту axios, який повинен виглядати так return axios.get(URLConstants.USER_URL, { headers: { Authorization: `Bearer ${data.token}` } });
foobar

1
Ласкаво просимо! Я постійно стикаюся з подібними проблемами зі своїми API. Просто радий, що я міг допомогти вам зрозуміти процес, який він повинен пройти.
Коул Еріксон,

44

Спробуйте це :

axios.get(
    url,
    {headers: {
        "name" : "value"
      }
    }
  )
  .then((response) => {
      var response = response.data;
    },
    (error) => {
      var status = error.response.status
    }
  );

1
Тож назва заголовка буде «Access-Control-Allow-Headers», а значення - те, що ви хочете.
Matija Župančić

Отже, ви маєте на увазі, що я мав би щось на зразок: axios.get (url, {headers: {'Access-Control-Allow-Headers': 'Bearer <my token>'}})? Це не працює.
foobar

11
Я вважаю, що це має бути {'Авторизація': 'Носій <мій жетон>'}
Джон Хардінг,

38

Це спрацювало для мене:

let webApiUrl = 'example.com/getStuff';
let tokenStr = 'xxyyzz';
axios.get(webApiUrl, { headers: {"Authorization" : `Bearer ${tokenStr}`} });

2
У відповіді менше деталей у порівнянні з вищезазначеним, але це відповідь, яку шукають усі, коли шукають у Google.
Чорна мамба

33

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

axios.defaults.headers.common['Authorization'] = `Bearer ${access_token}` 

як ви розміщуєте цю конфігурацію? в кореневій папці (index.js, App.js)? Або в окремому файлі?
ibubi

8

Ви майже праві, просто налаштуйте свій код таким чином

const headers = { Authorization: `Bearer ${token}` };
return axios.get(URLConstants.USER_URL, { headers });

Зверніть увагу, де я розміщую зворотні позначки, я додав '' після Bearer, ви можете пропустити, якщо ви будете впевнені, що обробляєте на стороні сервера


6
Зазвичай (за специфікацією) -між схемою автентифікації та маркером існує пробіл, а не тире ( ). Я ніколи не бачив, щоб сервер будь-якого типу вимагав тире, як ви показали, і більшість, якщо не всі, надішлють повідомлення про помилку, якщо таке буде.
Раман

6

Замість виклику функції axios.get Використовуйте:

axios({ method: 'get', url: 'your URL', headers: { Authorization: `Bearer ${token}` } })

1

Ви можете спробувати це.

axios.get(
    url,
    {headers: {
            "Access-Control-Allow-Origin" : "*",
            "Content-type": "Application/json",
            "Authorization": `Bearer ${your-token}`
            }   
        }
  )
  .then((response) => {
      var response = response.data;
    },
    (error) => {
      var status = error.response.status
    }
  );

0
res.setHeader('Access-Control-Allow-Headers',
            'Access-Control-Allow-Headers, Origin,OPTIONS,Accept,Authorization, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers');

Блок-цитата: вам потрібно додати OPTIONS & Authorization до setHeader ()

ця зміна виправила мою проблему, просто спробуйте!


0

Встановіть corsпроміжне програмне забезпечення. Ми намагалися вирішити це за допомогою власного коду, але всі спроби зазнали невдачі.

Це змусило це працювати:

cors = require('cors')
app.use(cors());

Оригінальне посилання


1
це для серверів вузлів, а не для axios
Марк Гарсія,

Користувачі, які знаходять це питання, можуть знайти цю відповідь корисною. Це запитання можна використовувати для роботи з вузловими серверами у випадках використання та нагадувати, що корди можуть вирішити свою проблему, або перемістити перевірку заголовка бекенда нижче вищевказаного коду. Допоміг мені врятувати стільки розчарувань, Дякую, дзвоник.
ДОРРІТО
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.