El middleware Express js no funciona como se esperaba. Muestra demasiadas redirecciones. Cuando elimino el token o cierro la sesión, se muestra en el navegador que hay demasiadas redirecciones
software intermedio
const isAuthenticate = async (req, res, next) => { const token = req.cookies.jwt; if (token) { jwt.verify(token, "thisisjwtsecret", async (err, token_decode) => { if (!err) { const u_id = token_decode._id; const userData = await User.findOne({ _id: u_id }); req.user = userData; req.isAuth = true; next(); } else { res.redirect("/user/login"); } }); } else { res.redirect("/user/login"); } };Ruta.js
// Auth Controller const AuthController = require("../../controllers/auth/AuthController"); const { isAuthenticate } = require("../../middlewares/isAutheticated"); router.get("/user/login", isAuthenticate, AuthController.login); router.post("/user/login", AuthController.checkLogin); router.get("/user/register", isAuthenticate, AuthController.createUser); router.post("/user/register", isAuthenticate, AuthController.storeUser); module.exports = router;Función de inicio de sesión
// Showing Login Page to User const login = (req, res) => { return res.render("auth/login"); };Cuando elimino el token o cierro la sesión, se muestra en el navegador que hay demasiadas redirecciones
Ahora que ha mostrado el código revisado para isAuthenticate() , el bucle de redirección es causado por las redirecciones en ese código. Esto es lo que sucede:
Alguna ruta que tenga (cualquier ruta) que use isAuthenticate como middleware para la ruta detecta que el usuario no ha iniciado sesión. Luego lo redirige a /user/login . Eso está bien hasta ese punto. Luego, el navegador emite una nueva solicitud para /user/login y eso lo lleva a esta definición de ruta:
router.get("/user/login", isAuthenticate, AuthController.login); Pero, esa definición de ruta nuevamente ejecuta el middleware isAuthenticate() que redirige a /user/login y, por lo tanto, tiene un ciclo de redireccionamiento infinito.
Probablemente solo necesite eliminar la isAuthenticate() de esta ruta. Si el usuario ya va a la página /user/login , no es necesario que verifique su autenticación ni que lo redirija. Si tiene una razón para querer saber si están autenticados o no, entonces necesita una versión separada que SOLO haga la verificación de autenticación y no redirija y puede usar eso en la definición de ruta /user/login .
Respuesta original antes de que se mostrara el código que hizo res.redirect().
Entonces, este middleware que muestra establece req.isAuth en true o false y luego llama a next() para continuar con el enrutamiento. Las tres rutas de código a través de ese middleware simplemente configuran req.isAuth y luego llaman a next() . En ninguna parte de este middleware hace ninguna redirección. Entonces, si el problema central son demasiadas redirecciones, ese problema debe ser causado en otro lugar por alguna otra ruta/middleware que realmente hace una redirección, probablemente cuando ve que req.isAuth es false ya que dijo que el problema ocurre cuando se desconecta o cuando falta el token.
Al redireccionar, debe asegurarse absolutamente de que cuando redirige a una URL, hay CERO posibilidades (sin ruta de código de ningún tipo) de que el controlador de ruta para esa URL también redirija a esa URL. Así es como entras en un bucle de redirección.
Mirando las otras rutas que muestra, si el problema de demasiados redireccionamientos es cuando se redirige a /user/login , entonces parece probable que el problema esté en el controlador authController.login() de esta ruta:
router.get("/user/login", isAuthenticate, AuthController.login); Si el código para esa ruta verifica req.isAuth y redirige en cualquier circunstancia, entonces sería un bucle de redireccionamiento sin fin.
Si necesita más asesoramiento, proporcione la siguiente información:
/user/login ?