[英]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.