【问题标题】:Next function not called if authentication fail passport如果身份验证失败护照,则不调用下一个函数
【发布时间】:2019-07-26 04:18:08
【问题描述】:

我正在使用 Passport.js 和 Express

这是策略:

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() 函数以便我可以向用户返回响应?

【问题讨论】:

    标签: node.js passport.js


    【解决方案1】:

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

    1. 带有successRedirectfailureRedirect 选项到authenticate()
    2. authenticate() 提供自定义回调,您可以在其中进行任何您想要的重定向并手动调用req.logIn()

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

    app.post("/Login", passport.authenticate("local", {
      successRedirect: "/User",
      failureRedirect: "/Login",
      failureFlash: true,
      successFlash: true,
    }));
    

    记得添加所需的包以显示 Flash 消息。

    【讨论】:

    • 我想向用户返回一条自定义消息,通知他登录失败。
    • @Hairi failureFlash: true 显示身份验证策略的默认消息。您可以通过将布尔值更改为类似failureFlash: "Invalid username or password" 的字符串来传递自定义消息。请记住在呈现页面时呈现 Flash 消息。
    猜你喜欢
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2015-09-06
    • 2019-03-10
    • 1970-01-01
    • 2015-08-21
    相关资源
    最近更新 更多