如果身份验证失败,则不会调用下一个函数

时间:2019-03-04 19:27:27

标签: node.js passport.js

我正在通过Express使用Passport.js

这是策略:

passport.use(
  new Strategy(async function(username, password, done) {
    try {
      var user = await db.findOne("users", { username: username });
      if (!user) {
        console.log(`Incorrect username`.red);
        return done(null, false, { message: "Incorrect username" });
      }
    } catch (error) {
      return done(error);
    }

    if (username !== user.username) {
      return done(null, false, { message: "Icorrect user!" });
    }
    if (password !== user.password) {
      // console.log("Incorrect Password");
      return done(null, false, { message: "Icorrect password!" });
    }
    return done(null, user, { message: "user lorem ipsum" });
  })
);

登录后请求身份验证已执行:

app.post(
    "/Login",
    // checkCred,
    passport.authenticate("local", {
      failureFlash: true,
      successFlash: true
    }),
    // The following function is only invoked if authentication succeeded
    (req, res) => {
      console.log(`Called`.red);
      console.log(`CAAALEEEEE`.green);

      res.send(
        JSON.stringify({
          status: "ok",
          message: "OK",
          redirect: "/User",
          user: req.user ? req.user : "user not found in request"
        })
      );
      // res.redirect("/User");
    }
  );

如果未通过身份验证,则永远不会调用第二个(req, res) => {函数。 如何使护照调用next()函数,以便我可以将响应返回给用户?

1 个答案:

答案 0 :(得分:0)

默认情况下,passport.authenticate()返回401 Unauthorized(登录失败)或继续使用填充了req.user的下一个中间件。您可以通过以下两种方式覆盖默认行为:

  1. 具有successRedirect的{​​{1}}或failureRedirect选项
  2. authenticate()提供自定义回调,您可以在其中进行任何重定向并手动调用authenticate()

在您的情况下,我将完全删除(req,next)处理程序,并像这样使用req.logIn()successRedirect

failureRedirect

请记住添加所需的软件包以显示Flash消息。