Node.js 应用中的多个本地策略不起作用
Multiple local strategies in Node.js app not working
我正在使用 Node.js 制作一个网络应用程序,它有两个角色的单独登录和注册 - “用户”和“组织”。
基本流程是:
用户
user\registration
-> user\login
-> dashboard
组织
org\registration
-> org\login
-> org-dashboard
由于有两个单独的身份验证案例,我使用了两个 new LocalStrategy
实例。
passport.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);
});
user.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 的新手,我参考了 this 以在多个本地策略的情况下获取代码。
请让我知道我必须进行任何更改或我需要添加任何其他内容。谢谢。
我能够解决问题。表单操作被重定向到 user\login
,这就是调用错误本地策略的原因。
我正在使用 Node.js 制作一个网络应用程序,它有两个角色的单独登录和注册 - “用户”和“组织”。
基本流程是:
用户
user\registration
-> user\login
-> dashboard
组织
org\registration
-> org\login
-> org-dashboard
由于有两个单独的身份验证案例,我使用了两个 new LocalStrategy
实例。
passport.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);
});
user.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 的新手,我参考了 this 以在多个本地策略的情况下获取代码。
请让我知道我必须进行任何更改或我需要添加任何其他内容。谢谢。
我能够解决问题。表单操作被重定向到 user\login
,这就是调用错误本地策略的原因。