Actualizando sesión de cookies en express no registrándote en el navegador.

He configurado una prueba de inicio de sesión de trabajo de la siguiente manera:

var express = require('express'); var fs = require('fs'); var http = require('http'); var path = require('path'); var routes = require('./routes/index.coffee'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var User = require('./userdb.coffee'); var app = express(); var RedisStore = require('connect-redis')(express); passport.use(new LocalStrategy(function(username, password, done) { return User.findOne({ username: username }, function(err, user) { if (err) { return done(null, false, message: error); } if (!user) { return done(null, false, { message: 'Unknown user' }); } if (!user.validPassword(password)) { return done(null, false, { message: 'Invalid password' }); } else { return done(null, user); } }); })); passport.serializeUser(function(user, done) { return done(null, user); }); passport.deserializeUser(function(user, done) { return done(null, user); }); app.configure(function() { app.set('port', process.env.PORT || 5003); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.enable('trust proxy'); app.use(express["static"](path.join(__dirname, 'public'))); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser('SOMESECRET')); app.use(express.session({ cookie: { maxAge: 10 * 60 * 1000 }, key: 'express.sid', secret: 'SOMESECRET', store: new RedisStore({ port: 6379, host: 'localhost' }) })); app.use(passport.initialize()); app.use(passport.session()); return app.use(app.router); }); var check_auth = function(req, res, next) { if (req.isAuthenticated()) { console.log(req.session.cookie.expires); return next(); } return res.redirect('/login'); }; app.get('/', check_auth, routes.index); app.get('/login', routes.login); app.get('/logout', routes.logout); app.post('/authenticate', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' })); app.listen(app.get('port'), '0.0.0.0'); 

Se omiten las rutas y la lógica del usuario, ya que supongo que son irrelevantes para mi problema, pero las compartiré con gusto si es necesario (son muy pequeñas, esto es solo para tener una pequeña prueba de concepto en funcionamiento) .

Los trabajos de inicio de sesión, los trabajos de lectura de sesión, las plantillas de representación basadas en los valores de sesión funcionan. Mi problema es con maxAge / expires . No estoy seguro de dónde reside el problema, pero trataré de describirlo:

Cuando inicio sesión, la sesión se guarda con passport.js , almacenada correctamente en mi RedisStore , y una cookie que apunta a la sesión se devuelve al navegador. En solicitudes posteriores, la cookie se encuentra correctamente y apunta a la sesión correcta desde mi SessionStore . req.session.cookie muestra un ACTUALIZADO expires y en mi servidor redis , el TTL se restablece a 10 minutos (600).

Mi problema es que la cookie permanece en la misma fecha de vencimiento en el navegador (Chrome, Windows y Mac).

Así que mi pregunta es : ¿Cómo puedo depurar esto más? A medida que se actualiza req.session (mediante express , connect-redis internamente / automáticamente), me pregunto dónde está el problema y qué debo hacer para solucionarlo: la cookie permanece en el máximo inicial / caduca .

Cualquier consejo, punteros o ideas son agradecidos.

Express-Session admite una fecha de caducidad de cookie móvil. Desafortunadamente, solo fue documentado recientemente.

Utilice la opción “rodando” para su sesión. Esto “fuerza un conjunto de cookies en cada respuesta” y “restablece la fecha de caducidad”. Desea establecer balanceo a verdadero.

También presta atención a la opción “resave”. Eso “hace que la sesión se guarde incluso cuando no esté modificada …” Es probable que también desee configurar esa opción en verdadero. Tenga en cuenta que aunque el valor predeterminado sea verdadero para esta opción, debe establecer el valor explícitamente. Confiar en el valor predeterminado para esta opción, en lugar de configurarlo explícitamente, ahora está en desuso.

Intenta algo como:

 app.use( session( { secret: 'keyboard cat', cookie: { maxAge: 60000 }, rolling: true, resave: true, saveUninitialized: false } ) ); 

Aquí está la documentación. Busque en “Opciones” y “opciones.resve”: https://github.com/expressjs/session .

Después de algunas excavaciones, resulta que Express no admite este tipo de balanceo, y se deja como un ejercicio para que el progtwigdor lo implemente.

Sería de ayuda que la caducidad de los navegadores fuera fácilmente legible para express , de modo que usted pudiera saltar la sesión solo cuando esté cerca de la caducidad, pero uso esto como una solución (ineficiente) hasta que descubra algo más inteligente:

 check_auth = function(req, res, next) { console.log(req.isAuthenticated()); if (req.isAuthenticated()) { if (req.session.roll) { req.session.roll = 0; } else { req.session.roll = 1; } return next(); } return res.redirect('/login'); }; 

Donde el roll podría ser cualquier cosa, el punto es la sesión se cambia (en cada solicitud autenticada *).

*) lo que también significa que es tremendamente ineficiente, pero lo hará por ahora.

Una alternativa podría ser buscar el TTL del identificador de sesión. Esto debería verificarse de la siguiente manera: si ttl <10% * maxAge (según lo define la aplicación), ya que el TTL se actualiza correctamente en cada solicitud, es solo que Set-Cookie no se envía. Como tal, digamos que el usuario se mantiene dentro del 90% de maxAge, su cookie de navegador eventualmente caducará, por lo que incluso ese enfoque no es suficiente. Aunque podría ser un buen medio campo.

Dejaré la pregunta sin aceptar, para alentar a otros a participar con mejores soluciones.

Intereting Posts