У меня есть приложение response / redux, которое получает токен с сервера api. После аутентификации пользователя я хотел бы, чтобы все запросы Axios содержали этот токен в качестве заголовка авторизации без необходимости вручную прикреплять его к каждому запросу в действии. Я новичок в реакции / сокращении, и я не уверен в лучшем подходе, и я не нахожу качественных результатов в Google.
Вот моя настройка редукции:
// actions.js
import axios from 'axios';
export function loginUser(props) {
const url = `https://api.mydomain.com/login/`;
const { email, password } = props;
const request = axios.post(url, { email, password });
return {
type: LOGIN_USER,
payload: request
};
}
export function fetchPages() {
/* here is where I'd like the header to be attached automatically if the user
has logged in */
const request = axios.get(PAGES_URL);
return {
type: FETCH_PAGES,
payload: request
};
}
// reducers.js
const initialState = {
isAuthenticated: false,
token: null
};
export default (state = initialState, action) => {
switch(action.type) {
case LOGIN_USER:
// here is where I believe I should be attaching the header to all axios requests.
return {
token: action.payload.data.key,
isAuthenticated: true
};
case LOGOUT_USER:
// i would remove the header from all axios requests here.
return initialState;
default:
return state;
}
}
Мой токен хранится в хранилище redux под state.session.token
.
Я немного не понимаю, как действовать дальше. Я попытался создать экземпляр axios в файле в моем корневом каталоге и обновить / импортировать его вместо node_modules, но он не прикрепляет заголовок при изменении состояния. Любые отзывы / идеи приветствуются, спасибо.
Ответы:
Есть несколько способов добиться этого. Здесь я объяснил два наиболее распространенных подхода.
1. Вы можете использовать перехватчики axios для перехвата любых запросов и добавления заголовков авторизации.
2. Из документации по
axios
вы можете увидеть , есть доступный механизм , который позволяет установить заголовок по умолчанию , который будет отправлен с каждым запросом вы делаете.Итак, в вашем случае:
При желании вы можете создать самоисполняемую функцию, которая сама установит заголовок авторизации, когда токен присутствует в магазине.
Теперь вам больше не нужно вручную прикреплять токен к каждому запросу. Вы можете поместить указанную выше функцию в файл, который гарантированно будет выполняться каждый раз ( например: Файл, содержащий маршруты).
Надеюсь, поможет :)
источник
axios.defaults.header.common[Auth_Token] = token
просто.Если вы используете версию "axios": "^ 0.17.1", вы можете сделать это так:
Создайте экземпляр axios:
Затем для любого запроса токен будет выбран из localStorage и добавлен в заголовки запроса.
Я использую один и тот же экземпляр во всем приложении с этим кодом:
Удачи.
источник
Лучшее решение для меня - создать клиентскую службу, которую вы будете создавать с помощью своего токена и использовать для обертывания
axios
.В этом клиенте вы также можете получить токен из localStorage / cookie по своему усмотрению.
источник
Точно так же у нас есть функция для установки или удаления токена из таких вызовов:
Мы всегда очищаем существующий токен при инициализации, а затем устанавливаем полученный.
источник
Если вы хотите в будущем вызывать другие маршруты api и хранить свой токен в магазине, попробуйте использовать промежуточное программное обеспечение redux .
Промежуточное ПО может прослушивать действие api и соответственно отправлять запросы api через axios.
Вот очень простой пример:
действия / api.js
промежуточное ПО / api.js
источник
Иногда возникает ситуация, когда некоторые запросы, сделанные с помощью axios, указываются на конечные точки, которые не принимают заголовки авторизации. Таким образом, альтернативный способ установки заголовка авторизации только для разрешенного домена показан в примере ниже. Поместите следующую функцию в любой файл, который запускается каждый раз при запуске приложения React, например, в файле маршрутов.
источник
Попробуйте создать новый экземпляр, как я сделал ниже
Как это использовать
источник
Попал в некоторые ошибки при попытке реализовать что-то подобное, и на основе этих ответов я пришел к этому. У меня возникли следующие проблемы:
источник
Дело в том, чтобы установить токен на перехватчиках для каждого запроса.
источник