192 votes

Faire en sorte qu'Axios envoie automatiquement des cookies dans ses requêtes

J'envoie des requêtes du client à mon serveur Express.js en utilisant Axios.

J'ai défini un cookie sur le client et je veux lire ce cookie à partir de toutes les demandes Axios sans avoir à les ajouter manuellement à la demande.

Voici l'exemple de ma demande côté client :

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

J'ai essayé d'accéder aux en-têtes ou aux cookies en utilisant ces propriétés dans mon serveur Express.js :

req.headers
req.cookies

Aucun d'entre eux ne contenait de cookies. J'utilise un intergiciel d'analyse des cookies :

app.use(cookieParser())

Comment puis-je faire en sorte qu'Axios envoie automatiquement des cookies dans les requêtes ?

Edit :

Je configure le cookie sur le client comme ceci :

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:'/'})
        }
      })
    }
...

Bien qu'il utilise également Axios, ce n'est pas pertinent pour la question. Je veux simplement intégrer les cookies dans toutes mes requêtes une fois qu'un cookie est défini.

1 votes

Comment avez-vous configuré le cookie sur le client ? montrez un exemple de code s'il vous plaît :)

0 votes

@TzookBarNoy Ajouté le code en question

0 votes

Les cookies sont définis par les serveurs avec Set-Cookie et non par le client, je suppose que vous voulez dire lire le cookie sur le client. Selon le protocole Cookie, le client doit inclure un en-tête Cookie dans ses demandes au serveur émetteur du cookie.

363voto

fingerpich Points 3356

J'ai eu le même problème et je l'ai résolu en utilisant l'option withCredentials propriété.

XMLHttpRequest provenant d'un domaine différent ne peut pas définir les valeurs de cookie pour son propre domaine, à moins que withCredentials ne soit défini à true avant d'effectuer la requête.

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

15 votes

Si vous essayez de vous connecter à une application Express, vous devrez utiliser des cors et utiliser ces paramètres. L'origine de la requête est requise. app.use(cors({credentials : true, origin : ' localhost:8080 '})) ;

32 votes

Notez que cela ne fonctionnera que lorsque le Access-Control-Allow-Origin dans l'en-tête de réponse n'est pas défini comme un caractère générique (*)

1 votes

@JerryZhang Que voulez-vous dire ? Je suis confronté au même problème, si Access-Control-Allow-Origin n'est pas réglé sur * cela signifie que je ne ferai pas de demande à ce serveur à cause de CORS.

63voto

Fatih Points 8709

TL;DR :

{ withCredentials: true } o axios.defaults.withCredentials = true


Extrait de la documentation axios

withCredentials: false, // default

withCredentials indique si les demandes de contrôle d'accès intersites doivent ou non être effectuées à l'aide d'informations d'identification.

Si vous passez { withCredentials: true } avec votre demande, cela devrait fonctionner.

Un meilleur moyen serait de mettre withCredentials comme true sur axios.defaults

axios.defaults.withCredentials = true

12 votes

Envoi d'informations d'identification avec chaque demande est une mauvaise pratique. Ces contrôles sont en place pour une raison. Parler à un autre service, envoyer tous vos cookies, qu'ils soient utilisés ou non, est un terrain propice à l'exploitation.

8 votes

@colminator seuls les cookies ayant pour domaine le serveur seront envoyés. (Par défaut, ils ne seront pas non plus envoyés aux sous-domaines et il est possible d'effectuer un filtrage supplémentaire basé sur le chemin). En fait, nous n'envoyons que les cookies du serveur qui ont été définis par le serveur.

0 votes

Savez-vous si, côté client, je peux modifier (par exemple, supprimer) les cookies définis par le serveur ?

19voto

Eyk Rehbein Points 932

Il est également important de définir les en-têtes nécessaires dans la réponse express. Voici ceux qui ont fonctionné pour moi :

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

0 votes

Ajout de X-PINGOTHER en Access-Control-Allow-Headers a été obligatoire pour moi (Node.js 6.9 avec Express 4.16, Chrome 63). Consultez JakeElder L'article de l'auteur sur ce problème GitHub : github.com/axios/axios/issues/191#issuecomment-311069164

0 votes

Cela était nécessaire ainsi que axios.defaults.withCredentials = true; sur ma configuration axios frontale. Après avoir supprimé le proxy create-react-app dans package.json, nous avons dû activer withCredentials, ainsi qu'inclure le middleware ci-dessus dans notre application express. Merci pour votre aide.

18voto

RITESH ARORA Points 343

Je ne suis pas familier avec Axios, mais pour autant que je sache, en javascript et ajax il existe une option

withCredentials: true

Cela permettra d'envoyer automatiquement le cookie au côté client. A titre d'exemple, ce scénario est également généré avec passportjs, qui place un cookie sur le serveur

6voto

machineghost Points 9864

Une autre solution consiste à utiliser cette bibliothèque :

https://github.com/3846masa/axios-cookiejar-support

qui intègre le support "Tough Cookie" dans Axios. Notez que cette approche nécessite toujours l'utilisation de l'option withCredentials drapeau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X