node.js - 如何将passportjs自动生成的哈希密码与登录密码进行比较?
问题描述
我正在使用 passportJs 进行用户身份验证。此外,我正在使用 passport-local-mongoose 将密码转换为散列密码并将散列和盐存储在 DB 中。登录时,我创建了 login-strategy ,它需要 email 和 password 。那么,如何将存储在数据库中的密码(哈希和盐)与用户在登录时输入的密码进行比较。
用户模式
const userSchema = new mongoose.Schema({
username: {
type: String,
},
email: {
type: String,
required: true,
unique: true,
},
role: {
type: String,
required: true,
default: "User",
},
});
报名路线
router.post("/register", async (req, res) => {
try {
const user = new User({
username: req.body.username,
email: req.body.email,
role: req.body.role,
});
const newUser = await User.register(user, req.body.password);
// console.log(newUser);
res.send(newUser);
} catch (error) {
console.log(error.message);
res.send(error);
}
});
本地策略
passport.use(
"local-login",
new localStrategy(
{
usernameField: "email",
},
async function (email, password, done) {
await User.findOne({ email: email }, function (err, user) {
console.log(user);
if (!user) {
console.log("Incorrect username.");
}
bcrypt.compareSync(password, user.password),//unable to get user.password because it store in hash
function (err, res) {
if (err) console.log(err);
if (res === false) {
console.log("Incorrect password.");
}
return user;
};
});
}
)
);
解决方案
实际上,您同时使用等待和回调。检查以下代码:
passport.use(
"local-login",
new localStrategy(
{
usernameField: "email",
},
async function (email, password, done) {
try {
const user = await User.findOne({ email: email });
console.log(user);
if (!user) {
console.log("Incorrect username.");
}
const passwordMatched = await bcrypt.compare(password, user.passwordHash);//unable to get user.password because it store in hash
if (passwordMatched) {
return user;
}
else {
console.log("Incorrect password.");
}
} catch (error) {
console.log(error)
}
}
));
推荐阅读
- java - Maven 资源插件排除文件夹
- tensorflow - 'NoneType' 对象在调用 model.fit_generator() 时不可调用
- firebase - 在 2 个单独的 Firebase 项目中使用相同的自定义域(不同的子域)。这可能吗?
- reactjs - 当父状态改变时 React 不会渲染子
- javascript - 在 JavaScript 中使用 Observer 处理多重错误
- java - 使用基于 jshell 构建的 iJAVA 时,VS 代码无法创建新单元格?
- javascript - 将 JS 数组转换为嵌套对象
- javascript - 使用 axios 上传块文件
- angular - 在 Angular 11 中集成 Material UI
- sql - 导出 SQL Server 数据库时没有 PK 或 FK