javascript node.js authentication passport.js

javascript - El usuario hace clic en el botón Atrás mientras la sesión todavía está autenticada y se redirecciona a la página de inicio de sesión en node.js



authentication passport.js (4)

Una de las "características" de (la mayoría) de los navegadores modernos es que al hacer clic en el botón Atrás, vuelve al estado en el que se cargó dicha página. A menos que actualice dinámicamente la página de inicio de sesión antes de navegar hacia el estado de inicio de sesión, esta es la experiencia que obtendrá.

Lo que sugeriría en su lugar una vez autenticado en la página de inicio de sesión, en lugar de redirigir inmediatamente al usuario al estado de inicio de sesión, actualice la página de inicio de sesión para indicar que el usuario ya inició sesión (por ejemplo, si tiene un icono de avatar / perfil en la esquina superior derecha, cambie la apariencia del archivo con .js para indicar que el usuario ha iniciado sesión).

Una vez que se haya cambiado el estado de la vista de inicio de sesión, navegue a la vista de contenido apropiada (el uso de una meta redirección podría ser el más apropiado, pero puede hacerlo como desee).

Puede suponer que debido a que el usuario hizo clic en el botón Atrás, probablemente lo hicieron. Esta solución asegura que se respete la expectativa del usuario sobre el comportamiento del botón de retroceso, en lugar de forzar un redireccionamiento detectando una cookie con js y re-navegando, lo que lleva a bucles de redireccionamiento hacia adelante / atrás (¡qué frustrantes!)

Si bien StackOverflow en realidad no hace lo que está tratando de hacer, aquí hay un ejemplo de lo que podría hacer con .js para actualizar /login dinámicamente antes de irse:

Tengo una aplicación web simple que tiene una pantalla de inicio de sesión y una página de actividad a la que solo se puede acceder cuando el usuario ha proporcionado credenciales válidas. Suponiendo que el usuario hace clic en el inicio de sesión con credenciales válidas y se redirige a la página de actividad. Ahora el usuario no hace clic en cerrar sesión, sino que simplemente hace clic en el botón Atrás del navegador y vuelve a la página de inicio de sesión. Este comportamiento es obviamente no intuitivo, supongo que mientras el usuario está conectado y hace clic en el botón Atrás para permanecer en la misma página y no volver a la página de inicio de sesión.

function loginUser(req, res) { if (req.session.auth) // if user is still authenticated { res.redirect(''/activity''); } res.render(''login''); }

Esta es una forma sencilla que uso actualmente para redirigir siempre al usuario a la página de actividad, sin embargo, considero que este es un método que desperdicia recursos ya que se introducen redirecciones no deseadas. Mi pregunta es, ¿es esta la manera estándar y más limpia de implementar el comportamiento anterior o hay un mecanismo mejor? Estoy usando el pasaporte para la autenticación y el almacenamiento de tokens jwt.

EDITAR: para volver a iterar, la solución anterior solo funciona si el navegador no-cache está habilitado, al contrario de lo que ocurre con el controlador de la ruta de inicio de sesión que ni siquiera se llama dado que el navegador ha almacenado la página en caché. Estoy buscando algo más robusto. No creo que sea una buena práctica codificar el navegador para no almacenar en caché la página en un entorno de producción.


Tu solución parece estar bien. Es posible que pueda mejorar su idea utilizando window.onbeforeforeload y window.onunload events. Algo como esto:

<script type="text/javascript"> window.onbeforeunload = onbeforeunload_handler; window.onunload = onunload_handler; function onbeforeunload_handler() { // Do something here } function onunload_handler() { // Or do something here } </script>


No he probado esto, pero creo que debería funcionar. Pruebe js res.redirect(''/activity?_=''+ Date.now()); para evitar que el navegador use la página en caché.


Tienes un par de soluciones aquí.

Uno de ellos sería decirle al navegador que no cache / inicie sesión. Esto tiene sentido por muchas razones. Sobre su preocupación de no querer deshabilitar el caché en la producción, recuerde que deshabilitará el caché solo para la página / login, que no es tan malo.

Una alternativa sería agregar algún código JS en la página / login que verificará si existe una cierta cookie registrada. En caso de que lo haga, simplemente actualice la página. Al actualizar la página, se ejecutará el lado del back-end y se producirá la redirección.

Yo iría con el primero. Para esa ruta en particular, algo en esta línea sería el truco (no probado).

res.set({ ''Cache-Control'': ''no-cache, no-store, must-revalidate'', ''Pragma'' : ''no-cache'', ''Expires'' : ''0'', })