簡體   English   中英

如何將用戶重定向到登錄頁面

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM