如果用戶在嘗試訪問 express js 中的登錄路由時已經登錄,我想重定向到儀表板
中間件
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");
}
};
路由.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;
登錄功能
// Showing Login Page to User
const login = (req, res) => {
return res.render("auth/login");
};
uj5u.com熱心網友回復:
您可以從現有isAuthenticate()函式中分離出功能,以便它只回傳一個結果,然后使用它來執行以下操作:
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");
}
};
isLoggedIn(req)如果令牌驗證并且在資料庫中找到用戶,則該函式將決議。否則,它會拒絕。然后,您可以在其他路由中使用它來決定是否要重定向。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/450883.html
標籤:javascript 节点.js 表示 验证 中间件
下一篇:從axios回應中反應更新狀態
