2012-06-10 14 views
30

Sto lavorando a un'app Node che utilizza Express e SocketIO. Voglio impostare un cookie nel mio controller Express, che è quindi accessibile dal mio codice Javascript sul lato client. Tutto ciò che provo non sembra funzionare:Imposta cookie accessibile lato client in Express

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

C'è qualcosa che mi manca qui? Grazie in anticipo!

+0

potrebbe aiutare a mostrare il codice lato client. – ebohlman

+0

Sto solo andando nell'ispettore Chrome e guardando i cookie. Non vedere nulla però ... – dshipper

risposta

48

Capito! Di default Express imposta l'opzione httpOnly su true. Ciò significa che non è possibile accedere ai cookie dal lato client Javascript. Per impostare correttamente i cookie accessibili sul client basta usare un frammento simile al seguente:

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

Ho anche notato che se si chiama questo comando e quindi chiamare res.redirect, il cookie non Get Set . Questo comando deve essere seguito da res.render ad un certo punto affinché funzioni. Non sono sicuro del perché questo sia.

+0

Questa è una buona informazione. Per caso sai come accedere a un cookie lato client sul lato server nel framework espresso? – user644745

+5

@ user644745 puoi leggere i cookie in Express guardando l'oggetto 'res.cookies'. Ad esempio, un cookie denominato 'session_id' esisterebbe su' res.cookies.session_id'. http://expressjs.com/api.html#req.cookies – frontendbeauty

+1

Il motivo per cui è necessario chiamare res.render o res.send è perché l'impostazione del cookie non avvia la risposta. Invia e Render fai. Questo metodo cookie aggiunge semplicemente un cookie all'oggetto risposta. –

3

In realtà ho riscontrato lo stesso problema per un paio d'ore.

Ecco il mio codice:

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

posso vedere le istruzioni Set-Cookie in intestazione di risposta, ma in Chrome non riesco a trovare il cookie e non riesco a trovare il cookie da req.cookies [' mycookie '].

La causa principale di questo problema è che non ho utilizzato la connessione HTTPS. (4.x Express con cookie-parser middleware)

Secondo questo documento: Simple Steps to Secure Your Express Node App

Se ho impostato l'opzione sicura = true, allora il browser non invia il mio biscotto in ogni richiesta HTTP ma HTTPS connessione sicura . Poi dopo aver rimosso sicuro: vera opzione, ho ottenuto il mio lavoro di cookie.

0

così possiamo utilizzare per accedere a http:

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