tiempo de expiración de sesión en una aplicación de nodejs + express usando setTimeOut() y un callback, y redirigir al usuario a la página de inicio de sesión.
Estoy tratando de implementar un tiempo de espera de sesión para una aplicación de nodejs + express + passport. Estoy usando setTimeOut() para llamar a un método en el cual estoy llamando a req.session.destroy() y req.logout() (para cerrar la sesión de Passport) para invalidar la sesión.
Estoy pasando req y res a setTimeOut – setTimeOut(timeOutMethod, 10000, req, res). Veo que la sesión queda en nulo. Verifiqué los objetos de solicitud en distintos momentos y coinciden.
Quiero poder llamar a la ruta /logout en el método timeOutMethod() (que es un callback para setTimeOut()) o volver a la página principal, pero no habrá contexto. No puedo usar un objeto res para redirigir al usuario. La aplicación realmente se bloquea en este punto.
¿Hay alguna forma de redirigir o actualizar la página para que el usuario sea enviado de vuelta a la pantalla de inicio de sesión?
¿Alguien puede ayudarme con esto? ¡Muchas gracias de antemano!
:Código:
router.get(callback_url, passport.authenticate(login_strategy, {failureFlash: true, failureRedirect: ‘/page’}),
function (req, res) {
if(req && req.session){//el tiempo máximo de espera está configurado en 1 minuto para pruebas…
setTimeout(sessionTimeOut, 1 * 60 * 1000, req, res);
}
res.redirect(‘/’);
});
// un callback para el tiempo de espera de la sesión…
function sessionTimeOut(req, res){
if (req.session) {
req.session.destroy(err => {
if (err) {
//declaraciones de registro
}
else {
//declaraciones de registro
if (req.user) {
//eliminar el valor de usuario de la sesión de passport.js si está presente
req.logout();
}
}
});
req.session = null;
}
else {
//declaraciones de registro
}
res.redirect(‘/page’);
}
//error lanzado cuando res.redirect(‘/page’) ya que no tenemos el contexto aquí.
_http_outgoing.js:561
[0] throw new ERR_HTTP_HEADERS_SENT(‘set’);
[0] ^
[0]
[0] Error [ERR_HTTP_HEADERS_SENT]: No se pueden establecer encabezados después de que se hayan enviado al cliente
[0] at ServerResponse.setHeader (_http_outgoing.js:561:11)
davy.ai
Para redirigir o actualizar la página cuando la sesión caduque, puedes utilizar una función de middleware en Express que compruebe si el usuario está autenticado o no. Si el usuario no está autenticado, puedes redirigir o actualizar la página a la pantalla de inicio de sesión:
En el ejemplo anterior, la función de middleware
isAuthenticated
comprueba si el usuario está autenticado utilizando el métodoreq.isAuthenticated()
proporcionado por passport.js. Si el usuario está autenticado, la solicitud se envía al siguiente middleware, de lo contrario, el usuario es redirigido a/login
.Puedes agregar este middleware a todas las rutas que desees proteger, y cuando la sesión caduque, el usuario será redirigido automáticamente a la pantalla de inicio de sesión.
Ten en cuenta que no debes utilizar los objetos
req
yres
pasados desde una función de tiempo de espera, ya que estos pueden haber caducado o sido destruidos. En su lugar, debes implementar la lógica de redirección dentro de la propia funciónsessionTimeOut
:En el ejemplo anterior, la función
sessionTimeOut
destruye la sesión y cierra la sesión del usuario utilizando los métodosreq.session.destroy()
yreq.logout()
respectivamente. Luego redirige al usuario a la pantalla de inicio de sesión utilizandores.redirect('/login')
.Puedes llamar a esta función como una devolución de llamada para el método
setTimeout
con un tiempo de espera de 1 minuto:Ten en cuenta que en lugar de pasar los objetos
req
yres
asetTimeout
, simplemente puedes llamar a la funciónsessionTimeOut
sin argumentos, ya que no los necesita.