首页 > 解决方案 > Node.js 应用程序中的多个本地策略不起作用

问题描述

我正在使用 Node.js 制作一个 Web 应用程序,它具有两个角色的单独登录和注册 - “用户”和“组织”。
基本流程是:
用户
user\registration-> user\login->dashboard

组织
org\registration-> org\login->org-dashboard

由于有两个单独的身份验证案例,我使用了两个new LocalStrategy.

护照.js

module.exports = function (passport) {
  passport.use(
    "user-local",
    new LocalStrategy({ usernameField: "email" }, (email, password, done) => {
      User.findOne({ email: email })
        .then((user) => {
          if (!user) {
            return done(null, false, {
              message: "That email has not been registered yet!",
            });
          }
          //Match password
          bcrypt.compare(password, user.password, (err, isMatch) => {
            if (err) throw err;
            if (isMatch) {
              return done(null, user);
            } else {
              return done(null, false, { message: "Password Incorrect" });
            }
          });
        })
        .catch((err) => console.log(err));
    })
  );

  passport.use(
    "org-local",
    new LocalStrategy({ usernameField: "email" }, (email, password, done) => {
      Organization.findOne({ email: email })
        .then((user) => {
          if (!user) {
            return done(null, false, {
              message: "That NGO has not been registered yet!",
            });
          }
          //Match password
          bcrypt.compare(password, user.password, (err, isMatch) => {
            if (err) throw err;
            if (isMatch) {
              return done(null, user);
            } else {
              return done(null, false, { message: "Password Incorrect" });
            }
          });
        })
        .catch((err) => console.log(err));
    })
  );

  passport.serializeUser((user, done) => {
    done(null, { _id: user.id, role: user.role });
  });

  passport.deserializeUser((login, done) => {
    if (login.role === "user") {
      User.findById(login, function (err, user) {
        if (user) done(null, user);
        else done(err, { message: "User not found" });
      });
    } else if (login.role === "org") {
      console.log("here");
      Organization.findById(login, (err, user) => {
        if (user) done(null, user);
        else done(err, { message: "Organization not found" });
      });
    } else {
      done({ message: "No entity found" }, null);
    }
  });
};

但是,即使用户登录工作正常,我也无法通过org\login.

org.js

//Org Login Handle
router.post("/login", (req, res, next) => {
  passport.authenticate('org-local', {
    successRedirect: "/org-dashboard",
    failureRedirect: "/org/login",
    failureFlash: true,
  })(req, res, next);
});

用户.js

//User Login Handle
router.post('/login', (req,res, next) =>{
    passport.authenticate('user-local', {
        successRedirect:'/dashboard',
        failureRedirect:'/user/login',
        failureFlash: true
    })(req, res, next);
});

每当我从org\login我注意到登录时,它都会进入user-local身份验证策略。我是 Node.js 的新手,在多个本地策略的情况下,我参考了这个来获取代码。
请让我知道我必须进行任何更改,或者我需要添加任何其他内容。谢谢。

标签: node.jsexpresspassport.js

解决方案


我能够解决这个问题。表单操作被重定向到user\login这就是调用错误本地策略的原因。


推荐阅读