Javascript 如何使用将用户重定向到登录页面

Javascript 如何使用将用户重定向到登录页面,javascript,node.js,Javascript,Node.js,我有一个NodeJS后端服务,我使用http代理中间件库来配置代理,并根据用户类型将用户重定向到相关的前端服务,该服务也在kubernetes中运行 比如说https://example.com是我的根地址。当用户输入此URL时,他/她会重定向登录页面,然后根据用户类型将其路由到相关前端。登录后,用户可以通过https://example.com/docs/employees。但如果他/她复制并粘贴https://example.com/docs/employeesURL没有登录,然后我抛出了一

我有一个NodeJS后端服务,我使用
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,以便用一个变量简化身份验证。我确信确实如此。也许如果你再多解释一点,它可能也适用于其他人?