Javascript 如何使用将用户重定向到登录页面
我有一个NodeJS后端服务,我使用Javascript 如何使用将用户重定向到登录页面,javascript,node.js,Javascript,Node.js,我有一个NodeJS后端服务,我使用http代理中间件库来配置代理,并根据用户类型将用户重定向到相关的前端服务,该服务也在kubernetes中运行 比如说https://example.com是我的根地址。当用户输入此URL时,他/她会重定向登录页面,然后根据用户类型将其路由到相关前端。登录后,用户可以通过https://example.com/docs/employees。但如果他/她复制并粘贴https://example.com/docs/employeesURL没有登录,然后我抛出了一
http代理中间件
库来配置代理,并根据用户类型将用户重定向到相关的前端服务,该服务也在kubernetes中运行
比如说https://example.com
是我的根地址。当用户输入此URL时,他/她会重定向登录页面,然后根据用户类型将其路由到相关前端。登录后,用户可以通过https://example.com/docs/employees
。但如果他/她复制并粘贴https://example.com/docs/employees
URL没有登录,然后我抛出了一个错误,如下面的“需要登录”。但我想也重定向用户到登录页面自动
我怎样才能做到这一点
我尝试使用自定义中间件,并使用类似于router.get(“/”,isAuth)
的方法,但对我无效。当我尝试在代理中返回res.redirect(“/redirect/oidcLogin”)
时,出现了一个循环
module.exports = (req, res, next) => {
if (!req.session.isLoggedIn && !req.session.userinfo) {
return res.redirect("/redirect/oidcLogin");
}
next();
}
路由器
router.get("/", (req, res) => {
if (req.session && req.session.userinfo && req.session.isLoggedIn) {
return res.redirect("/docs");
} else {
return res.redirect("/redirect/oidcLogin");
}
});
router.get("/redirect/oidcLogin", authController.redirectOidc);
router.get("/auth/login/callback", authController.callbackLogin);
router.get("/redirect/oidcLogout", authController.logOut);
module.exports = router;
app.js
const userTypeRouter = function (req) {
if (
!req.session ||
!req.session.userinfo ||
!req.session.userinfo.communities ||
!req.session.isLoggedIn
) {
const err = new Error("Please login");
err.statusCode = 403;
throw err;
}
let isUser1 = true;
if (req.session.userinfo.communities.includes("EMPLOYEE")) {
isUser1 = false;
}
if (isDealer) {
return "http://user1.svc.cluster.local";
} else {
return "http://user2.svc.cluster.local";
}
};
const options = {
router: userTypeRouter,
pathRewrite: {
["^/docs"]: "/",
},
changeOrigin: true,
ws: true,
};
const proxy = createProxyMiddleware(options);
app.use(authRoutes);
app.use("/docs", proxy);
app.use(
"/employees",
createProxyMiddleware({
router: userTypeRouter,
pathRewrite: {
"^/employees": "/",
},
changeOrigin: true,
ws: true,
})
);
app.use(
"/dealers",
createProxyMiddleware({
router: userTypeRouter,
pathRewrite: {
"^/dealers": "/",
},
changeOrigin: true,
ws: true,
})
);
app.use((error, req, res, next) => {
console.log(error);
const status = error.statusCode;
if (status === 403) {
res.status(status).send("Login required");
} else {
res.send(error.message);
}
});
理想情况下,您应该为生产模式设置一个会话存储,这样,如果您的服务器脱机或您使用多个服务器,您与用户的会话将被包含,并且用户可以基于密钥系统保持在线 另一方面,, res.redirect(“/redirect/oidcLogin”) 应将您带到yoursite.com/redirect/oidcLogin 如果你是说你陷入了一个循环,那很可能是因为在奥德克洛金(oidcLogin)被发现时,有一次检查失败了 代码对我来说声音不够大,但建议简化。。。 您只需要为会话设置isvalidated,并在用户根据您的条件进行验证时将其定义为true
WEBAPP.post('/login', LoginLimiter, (req, res) => {
if (req.session.loggedin) return res.redirect("/");
// Not logged in so let's run our code/and render the page.
});
这正是我们所需要的,当用户100%注册或登录时,loggedin将被设置为true。下面的内容对我有用
app.use(
"/employees",
isAuth,
createProxyMiddleware({
router: userTypeRouter,
pathRewrite: {
"^/employees": "/",
},
changeOrigin: true,
ws: true,
})
);
我已经对isLoggedIn进行了测试,如果有任何会话,我会将其设置为true。所以你的意思是我需要删除下面的部分。。在我的例子中,LoginLimiter中间件应该在哪里
jsif(req.session&&req.session.userinfo&&req.session.isLoggedIn){return res.redirect(“/docs”);}否则{return res.redirect(“/redirect/oidcLogin”);}
。如果(!req.session.isLoggedIn)呈现登录,您的登录将具有!如果登录或发生成功/失败,登录帖子将重定向。从那里的模式应该是如果没有登录,你不属于这里,转到主页。一旦登录,阻止注册/登录再次发生,直到会话结束。我担心在某些情况下会出现false/true/true,以便用一个变量简化身份验证。我确信确实如此。也许如果你再多解释一点,它可能也适用于其他人?