Saltar al contenido

Cierre de sesión automático después de inactividad

Haz todo lo posible por interpretar el código bien previamente a usarlo a tu trabajo si ttienes algo que aportar puedes dejarlo en los comentarios.

Solución:

Ok, arrojaré mis dos centavos al ring aquí.

Aunque en teoría es posible implementar esto usando rolling sessionno creo que debas…

  • Requeriría que cada acción del usuario envíe una solicitud al servidor, para que el usuario no cierre la sesión.
  • Pierde la oportunidad de informar a su usuario que pronto se cerrará automáticamente (esto es lo que hacen los bancos, por ejemplo).
    @Seth señaló en un comentario anterior que en realidad hay una manera de remediar esto: “Si la interfaz está separada del servidor, podría tener un middleware de enrutamiento del lado del cliente que verifica la cookie y visualmente cierra la sesión, demostrando así un buena experiencia de usuario”.
    Creo que esto es inteligente, pero también creo que es como ponerle lápiz labial a un cerdo.

Creo que el mejor enfoque aquí es manejar esto del lado del cliente.

Sugeriría algo como esto:

var AutoLogout = (function() 
  function AutoLogout() 
    this.events = ['load', 'mousemove', 'mousedown',
                   'click', 'scroll', 'keypress'];

    this.warn = this.warn.bind(this);
    this.logout = this.logout.bind(this);
    this.resetTimeout = this.resetTimeout.bind(this);

    var self = this;
    this.events.forEach(function(event) 
      window.addEventListener(event, self.resetTimeout);
    );

    this.setTimeout();
  

  var _p = AutoLogout.prototype;

  _p.clearTimeout = function() 
    if(this.warnTimeout)
      clearTimeout(this.warnTimeout);

    if(this.logoutTimeout)
      clearTimeout(this.logoutTimeout);
  ;

  _p.setTimeout = function() 
    this.warnTimeout = setTimeout(this.warn, 29 * 60 * 1000);

    this.logoutTimeout = setTimeout(this.logout, 30 * 60 * 1000);
  ;

  _p.resetTimeout = function() 
    this.clearTimeout();
    this.setTimeout();
  ;

  _p.warn = function() 
    alert('You will be logged out automatically in 1 minute.');
  ;

  _p.logout = function() 
    // Send a logout request to the API
    console.log('Sending a logout request to the API...');

    this.destroy();  // Cleanup
  ;

  _p.destroy = function() 
    this.clearTimeout();

    var self = this;
    this.forEach(function(event) 
      window.removeEventListener(event, self.resetTimeout);
    );
  ;

  return AutoLogout;
)();

es2015

class AutoLogout 
  constructor() 
    this.events = ['load', 'mousemove', 'mousedown',
                   'click', 'scroll', 'keypress'];

    this.warn = this.warn.bind(this);
    this.logout = this.logout.bind(this);
    this.resetTimeout = this.resetTimeout.bind(this);

    this.events.forEach((event) => 
      window.addEventListener(event, this.resetTimeout);
    );

    this.setTimeout();
  

  clearTimeout() 
    if(this.warnTimeout)
      clearTimeout(this.warnTimeout);

    if(this.logoutTimeout)
      clearTimeout(this.logoutTimeout);
  

  setTimeout() 
    this.warnTimeout = setTimeout(this.warn, 29 * 60 * 1000);

    this.logoutTimeout = setTimeout(this.logout, 30 * 60 * 1000);
  

  resetTimeout() 
    this.clearTimeout();
    this.setTimeout();
  

  warn() 
    alert('You will be logged out automatically in 1 minute.');
  

  logout() 
    // Send a logout request to the API
    console.log('Sending a logout request to the API...');

    this.destroy();  // Cleanup
  

  destroy() 
    this.clearTimeout();

    this.events.forEach((event) => 
      window.removeEventListener(event, this.resetTimeout);
    );
  

Solución de sondeo parcial:

var activityPolling = (function() 
  var events = ['load', 'mousemove', 'mousedown', 'click', 'scroll', 'keypress'];
  var active = true;
  var timeout;

  function poll() 
    if(active) 
      console.log('polling the server...')
    
  

  function setIdle() 
    active = false;
  

  function setActive() 
    active = true;
    if(timeout)
      clearTimeout(timeout);
    timeout = setTimeout(setIdle, 30 * 60 * 1000);
  

  function destroy() 
    clearInterval(interval);

    events.forEach(function(event) 
      window.removeEventListener(event, setActive);
    );
  

  events.forEach(function(event) 
    window.addEventListener(event, setActive);
  );

  setActive();

  var interval = setInterval(poll, 60 * 1000);

  return 
    interval: interval,
    destroy: destroy
  
)();

La sesión continua puede resolver el propósito.

Si usa la opción “rolling” para la sesión a “true”actualizará el tiempo de espera de la sesión en nuevas solicitudes.

Lo que puede hacer es: establecer la edad máxima en 5 minutos.

 maxAge: 30*10000

Cuando no hay actividad, max-age destruirá la sesión. Sin embargo, cuando haya alguna actividad, rodar renovará la sesión para estar activa durante los próximos 30 minutos.

Nuevamente, la palabra inactividad en esta pregunta es un poco engañosa. La inactividad puede ser cualquiera (o todas) sin movimiento del mouse, sin clic del mouse o sin interacción con el servidor.
Si se refiere a la inactividad como sin interacción con el servidor, esta lógica funcionará. Sin embargo, para la inactividad sin interacciones de interfaz de usuario, debe manejar desde el lado del cliente

valoraciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *