J'ai une application react / redux qui récupère un jeton sur un serveur api. Une fois que l'utilisateur s'est authentifié, j'aimerais que toutes les demandes axios aient ce jeton comme en-tête d'autorisation sans avoir à le joindre manuellement à chaque demande de l'action. Je suis assez nouveau pour réagir / redux et je ne suis pas sûr de la meilleure approche et je ne trouve pas de résultats de qualité sur Google.
Voici ma configuration 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;
}
}
Mon jeton est stocké dans le magasin redux sous state.session.token
.
Je ne sais pas trop comment procéder. J'ai essayé de créer une instance axios dans un fichier de mon répertoire racine et de mettre à jour / importer cela au lieu de node_modules, mais cela n'attache pas l'en-tête lorsque l'état change. Tous les commentaires / idées sont très appréciés, merci.
Réponses:
Il existe plusieurs façons d'y parvenir. Ici, j'ai expliqué les deux approches les plus courantes.
1. Vous pouvez utiliser les intercepteurs axios pour intercepter toutes les demandes et ajouter des en-têtes d'autorisation.
2. Dans la documentation de
axios
vous pouvez voir qu'il existe un mécanisme disponible qui vous permet de définir un en-tête par défaut qui sera envoyé avec chaque demande que vous faites.Donc dans votre cas:
Si vous le souhaitez, vous pouvez créer une fonction auto-exécutable qui définira lui-même l'en-tête d'autorisation lorsque le jeton est présent dans le magasin.
Désormais, vous n'avez plus besoin d'attacher manuellement un jeton à chaque demande. Vous pouvez placer la fonction ci-dessus dans le fichier dont l'exécution est garantie à chaque fois ( ex: Fichier qui contient les routes).
J'espère que ça aide :)
la source
axios.defaults.header.common[Auth_Token] = token
aussi simple que cela.Si vous utilisez la version "axios": "^ 0.17.1", vous pouvez faire comme ceci:
Créer une instance d'axios:
Ensuite, pour toute demande, le jeton sera sélectionné dans localStorage et sera ajouté aux en-têtes de la demande.
J'utilise la même instance partout dans l'application avec ce code:
Bonne chance.
la source
La meilleure solution pour moi est de créer un service client que vous instanciez avec votre jeton et que vous utiliserez pour envelopper
axios
.Dans ce client, vous pouvez également récupérer le jeton du localStorage / cookie, comme vous le souhaitez.
la source
De même, nous avons une fonction pour définir ou supprimer le jeton des appels comme celui-ci:
Nous nettoyons toujours le jeton existant à l'initialisation, puis établissons celui reçu.
la source
Si vous souhaitez appeler d'autres routes api à l'avenir et conserver votre jeton dans le magasin, essayez d' utiliser le middleware redux .
L'intergiciel peut écouter l'action an api et envoyer les requêtes API via axios en conséquence.
Voici un exemple très basique:
actions / api.js
middleware / api.js
la source
Parfois, vous obtenez un cas où certaines des requêtes effectuées avec axios sont pointées vers des points de terminaison qui n'acceptent pas les en-têtes d'autorisation. Ainsi, une autre façon de définir l'en-tête d'autorisation uniquement sur le domaine autorisé est comme dans l'exemple ci-dessous. Placez la fonction suivante dans n'importe quel fichier qui est exécuté à chaque exécution de l'application React, par exemple dans le fichier routes.
la source
Essayez de créer une nouvelle instance comme je l'ai fait ci-dessous
Comment l'utiliser
la source
Je suis tombé sur des pièges en essayant de mettre en œuvre quelque chose de similaire et sur la base de ces réponses, c'est ce que j'ai trouvé. Les problèmes que je rencontrais étaient:
la source
Le but est de définir le jeton sur les intercepteurs pour chaque requête
la source