Establezca maxAge individual para sesiones cuando use cookieSession () en connect / express

Estoy tratando de usar connect / express cookieSession() para almacenar mis sesiones de node.js en cookies (y, por lo tanto, evitar un almacén de sesiones del lado del servidor). Esto me ayudaría a “recordar” al usuario cuando inicia sesión y mantener las sesiones activas incluso después de reiniciar el servidor.

Me gustaría hacer esto con cookieSession() :

 app.use( express.cookieSession( { secret: 'secret_key' } ) ); app.use( function (req, res, next) { if ( req.method == 'POST' && req.url == '/login' ) { if ( req.body.remember ) { req.session.cookie.maxAge = 30*24*60*60*1000; // Rememeber 'me' for 30 days } else { req.session.cookie.expires = false; } } next(); }); 

Sin embargo, esto no funciona, porque req.session.cookie no está definido. También probé lo siguiente, pero no pareció funcionar:

 app.use( express.session( { secret: 'secret_key' } ) ); app.use( function (req, res, next) { if ( req.method == 'POST' && req.url == '/login' ) { if ( req.body.remember ) { req.cookies['connect.sess'].maxAge = 30*24*60*60*1000; // Rememeber 'me' for 30 days } else { rreq.cookies['connect.sess'].expires = false; } } next(); }); 

Comenzando con

 app.use(express.cookieSession({ secret: config.server.cookieSecret })); 

Y cambiándolo a

 app.use(function(req, res, next) { express.cookieSession({ secret: config.server.cookieSecret, cookie: { maxAge: req.param('remember') ? 20000 : 3000 }, })(req, res, next); }) 

Entonces, creamos nuestro propio middleware, envuelto alrededor del middleware cookieSession, cambiando el maxAge basado en un parámetro.

Por lo tanto, siempre que cambie la sesión, deberá pasar un remember en el body , la query o los params (ahí es donde se req.param() ). En la mayoría de los casos, solo configura un user_id a la sesión una vez, al iniciar sesión.

Son 3 segundos o 20 segundos para probar y asegurarse de que funcione.

Y, de nuevo, podría no ser muy útil si está configurando mucho su sesión, pero si solo configura un user_id para iniciar sesión, esto es todo lo que necesita.

Si está configurando muchas cosas para su sesión, debe saber que los datos se transfieren en cada solicitud y que debe guardar solo el mínimo en la sesión, como user_id, y luego buscar los datos que necesita para cada solicitud. la sobrecarga hacia abajo en el usuario.

Creo que esto hace lo que quieres:

 // Using express.session instead of express.cookieSession app.use(express.session({ secret : 'secret_key' })); app.use( function (req, res, next) { if ( req.method === 'POST' && req.url === '/login' ) { if ( req.body.remember ) { req.session.cookie.maxAge = 30*24*60*60*1000; // needed to make the session `dirty` so the session middleware re-sets the cookie req.session.random = Math.random(); } else { req.session.cookie.expires = false; } } next(); }); 

cookieSession hace algunas cosas funky, como del req.session.cookie (no estoy seguro de por qué).

Primero debe establecer req.session.cookie para poder establecer maxAge . Tratar de usarlo antes de configurarlo da req.session.cookie is undefined

express.cookieSession tiene valores predeterminados que acepta, consulte aquí . Debes mencionar todos los parámetros que vas a utilizar. Puede configurar la cookie a través de lo siguiente:

 app.use(express.cookieSession({ secret: 'secret_key', cookie :{ path: '/', httpOnly: true, maxAge: 30*24*60*60*1000} }); 

Un poco tarde para la mesa, pero pensé que esta respuesta podría ayudar a la gente a avanzar …

Estaba usando una sesión de cookies que no crea un objeto de cookie en request.session . Para implementar correctamente la funcionalidad rememberMe utilizando request.session.cookie , cambié cookie-session por express-session y eso lo resolvió todo. Así que ahora hay un objeto de cookie en sesión y es posible hacerlo dentro de una solicitud …

npm instalar sesión rápida

 app.post('/login', function(request, response, next) { passport.authenticate('local', function(err, user, info) { if(err) return next(err); if(!user) { request.flash('loginMessage', info.message); return response.redirect('/account/login'); } request.login(user, function(err) { if(err) return next(err); if(request.body.rememberMe) request.session.cookie.maxAge = 2592000000; else request.session.cookie.expires = false; return response.redirect(options.redirect); }); })(request, response, next); }); 

Esto también es bastante tarde, pero podría ayudar a otras personas.

Me parece que la mejor manera de conservar los datos de tu sesión es almacenarlos en algo así como redis. La pregunta pedía una manera que no usara el almacenamiento del servidor, pero creo que se estaba refiriendo más a MemoryStore. Tal vez no, pero de cualquier manera esto es lo que hice.

Utilicé express-session y connect-redis

 npm install -g connect-redis npm install -g express-session 

Entonces configuras cosas.

 // session modules var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var session = require('express-session') var redisStore = require('connect-redis')(session); // this sets up Redis to work with your session cookies var app = express(); 

Luego, simplemente inicie su sesión con la opción de almacenamiento establecida en su redisStore. La parte maxAge establece la duración de cada sesión en una hora, el middleware de la sesión lo restablece cuando se accede a él.

 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(session({ store: new RedisStore({ host:'127.0.0.1', port:6380, prefix:'sess' }), cookie: {maxAge: 3600000 }, secret: 'session_secret' })); 

Ahora, cuando un cliente se conecta, Express debe almacenar los datos de la sesión automáticamente en una estructura de datos de Redis. Debido a que no solo se almacena en la memoria caché, su servidor puede fallar y aún tener todos los datos de sesión relevantes aún disponibles en la dirección IP y en el puerto especificado.

Yummy parece permitir la modificación de las cookies después de su creación.

Intereting Posts