在 NodeJS 中登录后重定向到原始 URL

Redirect to original URL after login in NodeJS

我有一个 NodeJS 服务器,有些页面需要登录。目前,我有这个登录代码:

router.post("/login",
  passport.authenticate("user-otp", {
    successRedirect: "/dashboard",
    failureRedirect: "back",
  })
);

当我向未登录的用户发送 link 时,他们将被重定向到登录页面,输入凭据,转到通用页面,然后必须返回我的消息才能找到原来URL。我想压缩最后两个步骤,以便用户在登录后立即转到原始 URL。

之后,我尝试了以下操作:

router.post("/login", function(req, res, next) {
  let success = "/dashboard";
  if (req.query.redir) {
    success = req.query.redir;
  }
  return passport.authenticate("user-otp", {
    successRedirect: success,
    failureRedirect: "back",
  })
});

但是提交登录信息并没有得到服务器的响应,可能是因为我刚接触NodeJS和异步逻辑。

更新:我的护照功能是:

// Define the login strategy for users based on email and one-time-password.
passport.use('user-otp', new CustomStrategy(
  async function(req, done) {
    // logic...
    let user, email = req.body.email, is_email = false;
    try {
      
      user = await User.findOne({email});
      if (!user) {
        return done(null, false, {message: "failed"});
      }
    } catch (err) {
      console.error(err);
      return done(err);
    }
    let check = await user.validateOtp(req.body.otp);
    if ("valid" === check) {
      return done(null, user);
    } else {
      return done(null, false, {});
    }
  }));

如何在登录后将用户重定向到原来的URL?

第一个想法很好,但我认为您应该手动调用 passport,这就是为什么您没有从服务器收到任何响应的原因。

router.post("/login", function(req, res, next) {
 let success = "/dashboard";
 if (req.query.redir) {
   success = req.query.redir;
 }
 return passport.authenticate("some-strategy", {
   successRedirect: success,
   failureRedirect: "back",
 })(req, res, next)
});

要事第一

Following Send data back with the Passport js failureRedirect method , I tried the following:

router.post("/login", function(req, res, next) {
 let success = "/dashboard";
 if (req.query.redir) {
   success = req.query.redir;
 }
 return passport.authenticate("some-strategy", {
   successRedirect: success,
   failureRedirect: "back",
 })
});

问题代码示例中的(护照)策略是"some-strategy"

而您定义的策略名称是 user-otp

如果实际实现与我上面的描述不同,请更新问题以反映正确的代码。