2011-12-01 11 views
7

Estoy (casi) utilizando con éxito Node.js con Express y Redis para manejar sesiones.Node.js - La sesión no persiste a través de res.redirect()

El problema que tengo es que la sesión no se guarda cuando uso res.redirect().

Así es como lo veo:

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

El console.log() impresiones:

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

Ahora, aquí está el código siguiente:

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

Este console.log() imprime esto:

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

Claramente, el objeto 'nombre de usuario' ha desaparecido. La sesión no lo ha mantenido, y acaba de reconstruir uno nuevo.

¿Cómo puedo solucionar esto? No lo dudes si necesitas información.

Este es el código donde hice la gestión de sesiones:

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

Aquí es todo el proyecto (quiero decir, partes de ella), en lo esencial: https://gist.github.com/c8ed0f2cc858942c4c3b (ignorar las propiedades de los puntos de vista prestados)

+0

¿Puedes pegar también el código donde estás incluyendo la tienda de sesiones Redis? Hay una opción de tiempo de espera allí, tal vez accidentalmente lo configura demasiado bajo. – alessioalex

+0

Agregado :) Está configurado en 60 segundos, y claramente no uso 60 segundos para escribir las credenciales ... –

+0

Supongo que este es un proyecto pequeño, creo que es mejor publicarlo en alguna parte (gist, pastie) y dar un enlace. Apuesto a que el error está de alguna manera en un código que no está pegando. (solo una conjetura) – alessioalex

Respuesta

6

bien, he encontrado la solución. El problema es que el tiempo en maxAge se agregó a la fecha actual. Entonces, en el lado del navegador, la cookie expiró a la hora GMT que se muestra.

El problema fue el siguiente: uso una máquina virtual para probar node.js, y, sabes ... a veces, suspendes tu máquina.

Bueno, lo que sucedió es que el tiempo de la máquina era de dos días de retraso. Entonces, cada vez que la cookie se configuraba en el lado del servidor, el lado del cliente pensaba que la cookie ya había expirado, ya que mi máquina host no se retrasaba dos días.

Otro resultado estúpido.

1

Su código se ve bastante sólido, pero ¿hay alguna razón por la que está utilizando client.end()? Cierra a la fuerza la conexión Redis y no está limpio. No creo que lo necesite en absoluto:

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

No estoy seguro acerca de la arquitectura subyacente para conectar-Redis, pero me pregunto si llama client.end es lo que está restableciendo sus sesiones. ¿Qué pasa si los sacas?

+0

Gracias, no lo sabía. Pensé que sería más limpio. Sin embargo, no resuelve el problema, pero te estoy haciendo +1 :) –

0

Seguramente debe guardar esa sesión de alguna manera, esto podría funcionar.

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

Esto no cambia nada, desafortunadamente. Por cierto, ¿cuál es el sentido de esta función regenerada? –

+0

Si va a modificar los datos almacenados en una base de datos persistente, es lógico que deba * guardar * antes de poder usarlo en otras partes de su sistema. Me sorprende que la variable req.session.username persista * sin * guardar nada ... tal vez se haga automáticamente como una característica –

2

¿Has probado con diferentes navegadores? ¿Mantiene la misma identificación de sesión entre los redireccionamientos de página?

Se podría añadir req.session.cookie.expires = false; antes de redirigir ...

1

que estaba teniendo un problema similar en que yo estaba poniendo algo en la sesión que no fue persiste fuera de la app.get() se encuentra en.

Mi problema resultó ser que era no haciendo un res.redirect() al final de mi app.get(). Parece que estaba configurando algo en un objeto de solicitud y luego permitiendo que se recoja basura.

He añadido un res.redirect('/nextmethod') y los datos persisten muy bien.

Cuestiones relacionadas