Mam aplikację react / redux, która pobiera token z serwera API. Po uwierzytelnieniu użytkownika chciałbym, aby wszystkie żądania axios miały ten token jako nagłówek autoryzacji bez konieczności ręcznego dołączania go do każdego żądania w akcji. Jestem dość nowy, jeśli chodzi o reakcję / redukcję i nie jestem pewien najlepszego podejścia i nie znajduję żadnych wysokiej jakości hitów w Google.
Oto moja konfiguracja Redux:
// 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;
}
}
Mój token jest przechowywany w sklepie Redux pod adresem state.session.token
.
Jestem trochę zagubiony, jak postępować. Próbowałem utworzyć instancję axios w pliku w moim katalogu głównym i zaktualizować / zaimportować to zamiast z node_modules, ale nie dołącza nagłówka, gdy zmienia się stan. Wszelkie opinie / pomysły są bardzo mile widziane, dzięki.
Odpowiedzi:
Można to osiągnąć na wiele sposobów. Tutaj wyjaśniłem dwa najczęściej stosowane podejścia.
1. Możesz użyć przechwytywaczy axios do przechwytywania żądań i dodawania nagłówków autoryzacji.
2. Z dokumentacji od
axios
widać nie jest dostępny mechanizm, który pozwala na ustawienie domyślnego nagłówka, które będą wysyłane z każdym zamówienie można zrobić.Więc w twoim przypadku:
Jeśli chcesz, możesz utworzyć samowykonalną funkcję, która sama ustawi nagłówek autoryzacji, gdy token jest obecny w sklepie.
Teraz nie musisz już ręcznie dołączać tokena do każdego żądania. Możesz umieścić powyższą funkcję w pliku, który będzie wykonywany za każdym razem ( np.: Plik zawierający trasy).
Mam nadzieję, że to pomoże :)
źródło
axios.defaults.header.common[Auth_Token] = token
takie proste.Jeśli używasz wersji „axios”: „^ 0.17.1”, możesz to zrobić w ten sposób:
Utwórz instancję axios:
Następnie dla każdego żądania token zostanie wybrany z localStorage i zostanie dodany do nagłówków żądania.
Używam tego samego wystąpienia w całej aplikacji z tym kodem:
Powodzenia.
źródło
Najlepszym rozwiązaniem dla mnie jest utworzenie usługi klienckiej, której instancję utworzysz za pomocą tokenu i użyjesz jej do zawijania
axios
.W tym kliencie możesz również pobrać token z localStorage / cookie, jak chcesz.
źródło
Podobnie mamy funkcję ustawiania lub usuwania tokena z wywołań takich jak ta:
Zawsze czyścimy istniejący token podczas inicjalizacji, a następnie ustalamy otrzymany.
źródło
Jeśli chcesz w przyszłości wywoływać inne trasy API i zachować swój token w sklepie, spróbuj użyć oprogramowania pośredniego Redux .
Oprogramowanie pośredniczące może nasłuchiwać akcji api i odpowiednio wysyłać żądania API za pośrednictwem axios.
Oto bardzo podstawowy przykład:
działania / api.js
oprogramowanie pośredniczące / api.js
źródło
Czasami pojawia się przypadek, w którym niektóre żądania wysłane za pomocą axios są wskazywane na punkty końcowe, które nie akceptują nagłówków autoryzacji. Zatem alternatywnym sposobem ustawienia nagłówka autoryzacji tylko w dozwolonej domenie jest taki, jak w poniższym przykładzie. Umieść następującą funkcję w dowolnym pliku, który jest wykonywany za każdym razem, gdy aplikacja React jest uruchamiana, na przykład w pliku tras.
źródło
Spróbuj utworzyć nową instancję, tak jak to zrobiłem poniżej
Jak tego użyć
źródło
Wpadłem na kilka pułapek, próbując wdrożyć coś podobnego i na podstawie tych odpowiedzi wymyśliłem to. Problemy, których doświadczałem, to:
źródło
Chodzi o to, aby ustawić token na przechwytywaczach dla każdego żądania
źródło