[英]how to redirect user to login page with
我有一个 NodeJS 后端服务,我使用http-proxy-middleware
库来配置代理,并根据也在 kubernetes 中运行的用户类型将用户重定向到相关的前端服务。
假设https://example.com
是我的根地址。 当用户输入此 URL 时,他/她重定向登录页面,然后根据用户类型路由到相关前端。 登录后,用户可以通过https://example.com/docs/employees
访问内容。 但是,如果他/她在没有登录的情况下复制并粘贴https://example.com/docs/employees
URL,那么我会抛出如下错误“需要登录”。 但我也想自动将用户重定向到登录页面。
我怎样才能做到这一点?
我尝试使用自定义中间件并使用类似router.get("/", isAuth)
但对我不起作用。当我尝试在代理中return 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;
应用程序.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 的 GET 上的原因,有一个检查失败。
代码对我来说不够响亮,但建议是简化......您只需要为 session 设置 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% 注册或登录时,loginin 被设置为 true。
下面为我工作
app.use(
"/employees",
isAuth,
createProxyMiddleware({
router: userTypeRouter,
pathRewrite: {
"^/employees": "/",
},
changeOrigin: true,
ws: true,
})
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.