web-dev-qa-db-fra.com

Définir un cookie accessible côté client dans Express

Je travaille sur une application Node qui utilise Express et SocketIO. Je veux placer un cookie dans mon contrôleur Express qui est ensuite accessible à partir de mon code Javascript côté client. Tout ce que j'essaie ne fait pas semble pas fonctionner:

res.setHeader('Set-Cookie','test=value');
res.cookie('rememberme', 'yes', { maxAge: 900000 });

Y a-t-il quelque chose qui me manque ici? Merci d'avance!

32
dshipper

Deviner! Par défaut, Express définit l'option httpOnly sur true. Cela signifie que vos cookies ne sont pas accessibles par le Javascript côté client. Afin de définir correctement les cookies accessibles sur le client, utilisez simplement un extrait comme celui-ci:

res.cookie('rememberme', 'yes', { maxAge: 900000, httpOnly: false});

J'ai également remarqué que si vous appelez cette commande puis appelez res.redirect, le cookie ne sera pas défini. Cette commande doit être suivie par res.render à un moment donné pour qu'elle fonctionne. Je ne sais pas pourquoi c'est.

51
dshipper

En fait, j'ai rencontré le même problème pendant quelques heures.

Voici mon code:

res.cookie("mycookie", "1234567890", { secure:true, maxAge:120000, httpOnly: true });

Je peux voir l'instruction Set-Cookie dans l'en-tête de la réponse, mais dans Chrome je ne peux pas trouver le cookie et je ne peux pas trouver le cookie par req.cookies ['mycookie'].

La cause première de ce problème est que je n'ai pas utilisé de connexion HTTPS. (Express 4.x avec le middleware cookie-parser)

Selon ce document: étapes simples pour sécuriser votre Express Node App

Si je mets l'option secure = true, le navigateur n'enverra pas mon cookie dans une requête HTTP mais une connexion sécurisée HTTPS. Ensuite, après avoir supprimé secure: true option, j'ai obtenu mon travail de cookie.

3
ehe888

donc pour accéder à http on peut utiliser:

res.cookie("mycookie", "1234567890", { secure:false, maxAge:120000, httpOnly: true });?
0
user13548