简体   繁体   中英

I want to redirect to dashboard if user is already logged in when he try to access login route in express js

I want to redirect to dashboard if user is already logged in when he try to access login route in express js

Middleware

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");
    }
};

Route.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;

LOgin function

// Showing Login Page to User
const login = (req, res) => {
  return res.render("auth/login");
};

You can break out the functionality from your existing isAuthenticate() function so it just returns a result and then use that to do something like this:

const { promisify } = require('util');
const verify = promisify(jwt.verify);

// resolves if jwt cookie verifies and user found
// rejects if jwt cookie is missing or doesn't verify or user not found
async function isLoggedIn(req) {
    const token = req.cookies.jwt;
    if (!token) throw new Error("no jwt cookie");
    const token_decode = await verify(token, "thisisjwtsecret");
    let user = await User.findOne({ _id: token_decode._id });
    if (!user) throw new Error("user not found");
    return;
}

// Showing Login Page to User
// Or redirect to /dashboard if already logged in
const login = async (req, res) => {
    try {
        await isLoggedIn(req);
        // already logged in, redirect to dashboard
        // you MUST make sure that /dashboard does not redirect to /user/login itself
        // when isLoggedIn resolves to avoid circular redirects
        res.redirect("/dashboard");
    } catch (e) {
        // not logged in, render the login page
        res.render("auth/login");
    }
};

The isLoggedIn(req) function resolves if the token validates and the user is found in the database. Otherwise, it rejects. You can then use that in other routes to decide whether you want to redirect or not.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM