2011-12-01 5 views
7

Sto utilizzando (quasi) con successo Node.js con Express e Redis per gestire le sessioni.Node.js - La sessione non persiste attraverso res.redirect()

Il problema che sto avendo è che la sessione non viene mantenuta quando utilizzo res.redirect().

Ecco come posso vederlo:

req.session.username = username.toString(); 
console.log(req.session); 
res.redirect('/home'); 

Il console.log() stampa:

{ lastAccess: 1322579131762, 
    cookie: 
    { path: '/', 
    httpOnly: true, 
    _expires: Tue, 29 Nov 2011 15:06:31 GMT, 
    originalMaxAge: 60000 }, 
    username: 'admin' } 

Ora, ecco il codice seguente:

app.get('/home', [app.requireLogin], function(req, res, next) { 
// Not showing the rest as it's not even getting there 
// Instead, here is what's interesting 
app.requireLogin = function(req, res, next) { 
    console.log(req.session); 

Questo console.log() stampa questo:

{ lastAccess: 1322579131775, 
    cookie: 
    { path: '/', 
    httpOnly: true, 
    _expires: Tue, 29 Nov 2011 15:06:31 GMT, 
    originalMaxAge: 60000 } } 

Chiaramente, l'oggetto "nome utente" è scomparso. La sessione non lo ha tenuto, e appena ricostruito uno nuovo.

Come posso risolvere questo? Non esitare se hai bisogno di informazioni.

Ecco il codice in cui ho impostato la gestione delle sessioni:

app.configure(function() { 
    // Defines the view folder and engine used. 
    this.set('views', path.join(__dirname, 'views')); 
    this.set('view engine', 'ejs'); 

    // Allow parsing form data 
    this.use(express.bodyParser()); 

    // Allow parsing cookies from request headers 
    this.use(express.cookieParser()); 
    // Session management 
    this.use(express.session({ 
    // Private crypting key 
    secret: 'keyboard cat', 
    store: new RedisStore, 
    cookie: { 
     maxAge: 60000 
    } 
    })); 
    this.use(app.router); 
}); 

Ecco l'intero progetto (voglio dire, parte di esso), il succo: https://gist.github.com/c8ed0f2cc858942c4c3b (ignorare le proprietà delle viste renderizzate)

+0

È possibile incollare anche il codice in cui si include lo store di sessione Redis? C'è un'opzione di timeout, forse l'hai accidentalmente impostata troppo bassa. – alessioalex

+0

Aggiunto :) È impostato su 60 secondi, e chiaramente non uso 60 secondi per scrivere le credenziali ... –

+0

Presumo che questo sia un piccolo progetto, penso sia meglio postarlo da qualche parte (gist, pastie) e dare un collegamento. Scommetto che l'errore è in qualche modo in un codice che non stai incollando. (solo un'ipotesi) – alessioalex

risposta

6

Va bene, ho trovato la soluzione. Il problema è che l'ora in maxAge è stata aggiunta alla data corrente. Quindi, nel lato browser, il cookie era impostato per scadere all'ora GMT mostrata.

Il problema era il seguente: utilizzo una macchina virtuale per testare node.js e, sai ... a volte, si sospende la macchina.

Bene, quello che è successo è che il tempo della macchina era di due giorni di ritardo. Quindi, ogni volta che il cookie veniva impostato sul lato server, il lato client pensava che il cookie fosse già scaduto, dal momento che il mio computer host non era in ritardo di due giorni.

Un altro risultato stupido.

1

Il tuo codice sembra abbastanza solido, ma c'è un motivo per cui stai usando client.end()? Chiude forzatamente la connessione redis e non è pulita. Non credo che è necessario a tutti:

https://github.com/mranney/node_redis/issues/74

io non sono sicuro circa l'architettura sottostante per Connect-Redis, ma mi chiedo se chiamando client.end è quello che sta reimpostando le sessioni. Cosa succede se li togli?

+0

Grazie, non lo sapevo. Pensavo sarebbe stato più pulito. Tuttavia, non risolve il problema, ma sto facendo +1 su di te :) –

0

Sicuramente è necessario salvare quella sessione in qualche modo, questo potrebbe funzionare.

req.session.regenerate(function(){ 
    req.session.username = username.toString(); 
    res.redirect('/home'); 
}); 
+0

Questo non cambia nulla, sfortunatamente. A proposito, qual è il punto di questa funzione di rigenerazione? –

+0

Se si intende modificare i dati memorizzati in un database persistente, è logico che sia necessario * salvarlo * prima di poterlo utilizzare in altre parti del sistema. Sono sorpreso che la variabile req.session.username persista * senza * salvare nulla ... forse è fatto automaticamente come una funzionalità –

2

Hai provato con browser diversi? Stai mantenendo lo stesso ID di sessione tra i reindirizzamenti di pagina?

Si potrebbe aggiungere req.session.cookie.expires = false; prima di reindirizzare ...

1

stavo avendo un problema simile in che stavo installando qualcosa sulla sessione che non è stato persiste al di fuori della app.get() è stato impostato in.

Il mio problema si è rivelato che ero non facendo un res.redirect() alla fine del mio app.get(). Sembra che stavo impostando qualcosa su un oggetto richiesta e quindi permettendogli di raccogliere i dati inutili.

Ho aggiunto un res.redirect('/nextmethod') e i dati persistono bene.