bcrypt.compare 承诺总是 returns 错误
bcrypt.compare promise always returns false
我在 GitHub 上查看了 bcrypt.compare 的其他问题,none 的解决方案对我有用。它总是在 bcrypt.compare()
中的 console.log("failed 3") 上失败
我试过切换 .then() 而不是按照另一个 post 的建议使用 bcrypt.compare 的回调,但这没有帮助。任何帮助将不胜感激!
下面是我的代码副本和所用版本的摘要:
- 节点 v8.12.0
- 快递 4.16.0
- bcrypt 3.0.3
- jsonwebtoken 8.4.0
- 猫鼬 5.4.1
Bcrypt Hash(密码哈希)
function saveUserData(req, res, next, userSignUpInfo, info){
bcrypt.hash(req.body.email, 10, (err, hash) =>{
if (err){
return res.status(500).json({
error: err
})
} else {
console.log('inside test route')
console.log('req.body.fnUserName', userSignUpInfo.fnUserName)
const userData = new UserData({
fnUserName : userSignUpInfo.fnUserName,
password : hash,
email : req.body.email,
verify: userSignUpInfo.verify,
createAccountDate: userSignUpInfo.createAccountDate,
userId : userSignUpInfo.userId,
friends: null,
online: null
})
userData.save()
.then(result => {
console.log('result from MongoDB Cloud', result);
saveApiData(info, userSignUpInfo, res);
})
.catch(err => console.log('error from MongoDB Cloud', err));
}
})
}
Bcrypt 比较(授权用户)
router.post('/login', (req, res, next) => {
UserData.find({email: req.body.email})
.exec()
.then(user => {
if(user.length < 1) {
console.log("failed 1")
return res.status(401).json({
message: 'Authentication Failed'
});
}
console.log('user[0].password', user[0].password)
console.log(' user[0].password', user[0].password)
console.log(' req.body.password', req.body.password)
bcrypt.compare(req.body.password,user[0].password).then(function(err, result) {
if (err) {
console.log("failed 1")
return res.status(401).json({
message: 'Authentication Failed'
});
}
if (result) {
const token = jwt.sign(
{
email: user[0].email,
userId: user[0].userId
},
process.env.JWT_KEY,
{
expiresIn: "1h" // he suggested one hour
}
);
console.log("failed 2")
return res.status(200).json({
message: 'Authentication Successful',
token: token
})
} else {
console.log("failed 3")
res.status(401).json({
message: 'Authentication Failed'
})
}
})
})
.catch(err => {
console.log('err in login', err);
res.status(500).json({
error: err,
message: 'error logging in'
})
})
});
通常,密码在数据库中保存为哈希值。此外,提供足够的长度以将哈希值保存到数据库中。(至少 60 个 varchars)。为此,
schema.pre("save", function (next) {
bcrypt.hash(this.password, 10, (err, hash) => {
this.password = hash;
next();
});
});
然后,将纯密码与数据库中的哈希值进行比较。
bcrypt.hash('mypassword', 10, function(err, hash) {
if (err) { throw (err); }
bcrypt.compare('mypassword', hash, function(err, result) {
if (err) { throw (err); }
console.log(result);
});
});
看起来你 return 你的 res.status 不在
else { console.log("failed 3")
像你在失败的 2 块和失败的 1 块中所做的那样块。
result
将始终是未定义的,因为承诺 return 一个单一的值和错误只是在流行语中抛出。所以基本上,在您的代码中,err 将包含实际结果。
您的代码应如下所示:
bcrypt.compare(req.body.password,user[0].password).then((result)=>{
if(result){
console.log("authentication successful")
// do stuff
} else {
console.log("authentication failed. Password doesn't match")
// do other stuff
}
})
.catch((err)=>console.error(err))
我在 GitHub 上查看了 bcrypt.compare 的其他问题,none 的解决方案对我有用。它总是在 bcrypt.compare()
中的 console.log("failed 3") 上失败我试过切换 .then() 而不是按照另一个 post 的建议使用 bcrypt.compare 的回调,但这没有帮助。任何帮助将不胜感激!
下面是我的代码副本和所用版本的摘要:
- 节点 v8.12.0
- 快递 4.16.0
- bcrypt 3.0.3
- jsonwebtoken 8.4.0
- 猫鼬 5.4.1
Bcrypt Hash(密码哈希)
function saveUserData(req, res, next, userSignUpInfo, info){
bcrypt.hash(req.body.email, 10, (err, hash) =>{
if (err){
return res.status(500).json({
error: err
})
} else {
console.log('inside test route')
console.log('req.body.fnUserName', userSignUpInfo.fnUserName)
const userData = new UserData({
fnUserName : userSignUpInfo.fnUserName,
password : hash,
email : req.body.email,
verify: userSignUpInfo.verify,
createAccountDate: userSignUpInfo.createAccountDate,
userId : userSignUpInfo.userId,
friends: null,
online: null
})
userData.save()
.then(result => {
console.log('result from MongoDB Cloud', result);
saveApiData(info, userSignUpInfo, res);
})
.catch(err => console.log('error from MongoDB Cloud', err));
}
})
}
Bcrypt 比较(授权用户)
router.post('/login', (req, res, next) => {
UserData.find({email: req.body.email})
.exec()
.then(user => {
if(user.length < 1) {
console.log("failed 1")
return res.status(401).json({
message: 'Authentication Failed'
});
}
console.log('user[0].password', user[0].password)
console.log(' user[0].password', user[0].password)
console.log(' req.body.password', req.body.password)
bcrypt.compare(req.body.password,user[0].password).then(function(err, result) {
if (err) {
console.log("failed 1")
return res.status(401).json({
message: 'Authentication Failed'
});
}
if (result) {
const token = jwt.sign(
{
email: user[0].email,
userId: user[0].userId
},
process.env.JWT_KEY,
{
expiresIn: "1h" // he suggested one hour
}
);
console.log("failed 2")
return res.status(200).json({
message: 'Authentication Successful',
token: token
})
} else {
console.log("failed 3")
res.status(401).json({
message: 'Authentication Failed'
})
}
})
})
.catch(err => {
console.log('err in login', err);
res.status(500).json({
error: err,
message: 'error logging in'
})
})
});
通常,密码在数据库中保存为哈希值。此外,提供足够的长度以将哈希值保存到数据库中。(至少 60 个 varchars)。为此,
schema.pre("save", function (next) {
bcrypt.hash(this.password, 10, (err, hash) => {
this.password = hash;
next();
});
});
然后,将纯密码与数据库中的哈希值进行比较。
bcrypt.hash('mypassword', 10, function(err, hash) {
if (err) { throw (err); }
bcrypt.compare('mypassword', hash, function(err, result) {
if (err) { throw (err); }
console.log(result);
});
});
看起来你 return 你的 res.status 不在
else { console.log("failed 3")
像你在失败的 2 块和失败的 1 块中所做的那样块。
result
将始终是未定义的,因为承诺 return 一个单一的值和错误只是在流行语中抛出。所以基本上,在您的代码中,err 将包含实际结果。
您的代码应如下所示:
bcrypt.compare(req.body.password,user[0].password).then((result)=>{
if(result){
console.log("authentication successful")
// do stuff
} else {
console.log("authentication failed. Password doesn't match")
// do other stuff
}
})
.catch((err)=>console.error(err))