Comment partager les cookies croisés d'origine? Plus spécifiquement, comment utiliser le Set-Cookie
en-tête en combinaison avec l’en-tête Access-Control-Allow-Origin
?
Voici une explication de ma situation:
J'essaie de définir un cookie pour une API qui s'exécute sur localhost:4000
dans une application Web hébergée sur localhost:3000
.
Il semble que je reçois les bons en-têtes de réponse dans le navigateur, mais malheureusement ils n’ont aucun effet. Ce sont les en-têtes de réponse:
HTTP/1.1 200 OK Contrôle d’accès-Autoriser-Origine: http: // localhost: 3000 Vary: Origine, Accepter-Encoder Set-Cookie : jeton = 0d522ba17e130d6d19eb9c25b7ac58387b798639f81ffe75bd449afbc3cc715d6b038e426adeac3316f0511dc7fae3f7; Max-Age = 86400; Domain = localhost: 4000; Path = /; Expire = mardi 19 septembre 2017 21:11:36 GMT; HttpOnly Content-Type: application/json; charset = utf-8 Content-Length: 180 ETag: W/"b4-VNrmF4xNeHGeLrGehNZTQNwaaUU" Date: lundi, 18 septembre 2017 21:11:36 GMT Connexion: garder en vie
De plus, je peux voir le cookie sous Response Cookies
lorsque j'inspecte le trafic à l'aide de l'onglet Réseau des outils de développement de Chrome. Pourtant, je ne vois pas de cookie en cours d’installation dans l’onglet Application sous Storage/Cookies
. Je ne vois aucune erreur CORS, alors je suppose que je manque quelque chose d'autre.
Aucune suggestion?
J'utilise le module request dans une application React-Redux pour envoyer une requête à un /signin
noeud final sur le serveur. Pour le serveur j'utilise express.
Serveur Express:
res.cookie ('jeton', 'xxx-xxx-xxx', {maxAge: 86400000, httpOnly: true, domaine: 'localhost: 3000'})
Demande dans le navigateur:
request.post ({uri: '/ signin', json: {userName: 'userOne', mot de passe: '123456'}}, (err, response, body) => { // faire des choses })
Je mets les en-têtes de requête et de réponse à présent comme des fous, en veillant à ce qu'ils soient présents à la fois dans la requête et dans la réponse. Ci-dessous une capture d'écran. Notez les en-têtes Access-Control-Allow-Credentials
, Access-Control-Allow-Headers
, Access-Control-Allow-Methods
et Access-Control-Allow-Origin
. En regardant le problème que j'ai trouvé à github d'Axios , j'ai l'impression que tous les en-têtes requis sont définis. Pourtant, il n'y a toujours pas de chance ...
Pour autoriser la réception et l'envoi de cookies par une demande CORS, procédez comme suit.
Back-end (serveur): Définissez l'en-tête HTTP Access-Control-Allow-Credentials
valeur à true
. Assurez-vous également que l’en-tête HTTP Access-Control-Allow-Origin
est défini.
Front-end (client): Définissez le XMLHttpRequest.withCredentials
flag à true
, ceci peut être réalisé de différentes manières en fonction de la bibliothèque requête-réponse utilisée:
jQuery 1.5.1xhrFields: {withCredentials: true}
ES6 fetch ()credentials: 'include'
axios : withCredentials: true
Évitez d’utiliser CORS en combinaison avec des cookies. Vous pouvez y parvenir avec un proxy.
Si pour une raison quelconque tu ne l'évites pas. La solution est ci-dessus.
Il s'est avéré que Chrome ne créera pas le cookie si le domaine contient un port. Le régler pour localhost
(sans port) n'est pas un problème. Merci beaucoup - Erwin pour ce conseil!