node.js - example - Trabajando con Sesiones en Express.js
passport session (2)
Necesito ayuda para entender el concepto de sesiones para una aplicación web. Estoy ejecutando un servidor Node.js con Express 3.0.
Mis objetivos son:
Crear una sesión para cada usuario que inicie sesión
Almacene esta sesión y utilícela para validar si el usuario ya inició sesión (evite que dos dispositivos usen el mismo usuario al mismo tiempo) y para limitar el acceso a ciertas páginas (al hacer coincidir el ID de la sesión con algunos otros datos)
Utilizaré MemoryStore para guardar las sesiones (parece más fácil). Si los objetivos anteriores tienen sentido, ¿puede proporcionar una explicación detallada de cómo lograrlos?
Utilice MemoryStore en expreso SOLAMENTE si no está creando instancias múltiples (como con el módulo de clúster). Si está equilibrando la carga entre máquinas, su equilibrador de carga deberá usar sesiones adhesivas / persistentes.
Si cumple con esos requisitos, entonces todo lo que necesita hacer es al iniciar sesión, una vez que se validan las credenciales, establezca una variable de sesión para indicar que inició sesión, por ejemplo:
req.session.loggedIn = true;
Si desea verificar si un usuario está conectado, simplemente verifique esa variable.
if (req.session.loggedIn) {
// user is logged in.
}
else {
// user is not logged in.
}
Mencionó que evita que un usuario único tenga sesiones de más de una sesión a la vez. Para lograrlo, puede que necesite almacenar algo en una base de datos que indique que el usuario ha iniciado sesión. Le advierto que esto puede ser peligroso debido a las sesiones caducas. Por ejemplo, ¿qué pasa si un usuario inicia sesión, pero nunca se desconecta? ¿Qué ocurre si cierran la ventana de su navegador para que la sesión desaparezca para siempre?
Express no tiene concepto de una caducidad de sesión inactiva. Lo he implementado al almacenar todas las sesiones en la base de datos junto con una última marca de tiempo accedida y luego limpiar periódicamente los datos de la sesión en función de la hora. Pero luego debe actualizar su lista de quién inició sesión también.
Express tiene buenos examples en el repositorio github. Uno de ellos trata con la authentication y muestra cómo adjuntar al usuario al objeto de la req.session
. Esto se hace dentro de la app.post(''/login'')
.
Para limitar el acceso a ciertas páginas, agrega un middleware simple a esas rutas
function restrict(req, res, next) {
if (req.session.user) {
next();
} else {
req.session.error = ''Access denied!'';
res.redirect(''/login'');
}
}
app.get(''/restricted'', restrict, function(req, res){
res.send(''Wahoo! restricted area, click to <a href="/logout">logout</a>'');
});
Como ya mencionó Brandon , no debería usar MemoryStore en producción. Redis es una buena alternativa. Use connect-redis para acceder al db. Una configuración de ejemplo se ve así
var RedisStore = require(''connect-redis'')(express);
// add this to your app.configure
app.use(express.session({
secret: "kqsdjfmlksdhfhzirzeoibrzecrbzuzefcuercazeafxzeokwdfzeijfxcerig",
store: new RedisStore({ host: ''localhost'', port: 3000, client: redis })
}));