问题描述
我已经使用bcryptjs对我的密码进行哈希处理,并且用户的注册进行得很好。
但是,当我尝试登录时,如果密码包含数字或其他字符,则bcrypt.compare函数将返回 false 承诺。
如果密码只是字母,则一切正常。
我到处搜索,但找不到该错误的解决方案?
这是我的文件:
users.js(模型)
var mongoose = require("mongoose");
var bcrypt = require("bcryptjs");
var userSchema = mongoose.Schema({
name: String,email: String,password: String,products: [{
type: mongoose.Schema.Types.ObjectID,ref: "Product"
}],username: String
});
var User = module.exports = mongoose.model("User",userSchema);
module.exports.createuser = function(newUser,callback) {
bcrypt.genSalt(5,function(err,salt){
bcrypt.hash(newUser.password,salt,hash){
newUser.password = hash;
newUser.save(callback);
});
});
}
module.exports.comparePassword = function(candidatePassword,hash,callback){
bcrypt.compare(candidatePassword,isMatch) {
if(err) throw err;
console.log(isMatch);
callback(null,isMatch);
});
}
module.exports.getUserByUsername = function(username,callback){
var query = {username: username};
User.findOne(query,callback);
}
app.js
app.use(passport.initialize());
app.use(passport.session());
var LocalStrategy = require("passport-local").Strategy;
passport.use(new LocalStrategy(
function(username,password,done) {
User.findOne({username:username},user){
if(err) throw err;
if(!user) {
return done(null,false,{message: 'UnkNown user'});
}
User.comparePassword(password,user.password,isMatch){
if(err) {
console.log("ERR1");
return done(err);
}
if(isMatch) {
console.log("MATCH");
return done(null,user);
} else {
console.log("NOT VALID");
return done(null,{message: 'Invalid password'});
}
});
});
}
));
passport.serializeUser(function(user,done){
done(null,user.id);
});
passport.deserializeUser(function(id,done){
User.getUserById(id,user){
done(err,user);
})
})
users.js(ROUTE)
router.post("/login",passport.authenticate('local',function (error,user,info){
if(error) {
console.error(error);
console.log('Failed login:');
}
if (user === false) {
console.log("user not found");
} else {
// handle successful login ...
console.log("logged in");
}
}),function (req,res) {
res.send(req.user);
});
router.post("/signup",res) {
console.log(req.body);
var password = req.body.password;
var password2 = req.body.password2;
if(password == password2) {
var newUser = new User ({
name: req.body.name,email: req.body.email,username: req.body.username,password: req.body.username
});
User.createuser(newUser,user){
if(err)
throw err;
console.log(user);
res.send(user).end();
});
} else {
res.status(500).send("{errors: \"Passwords don't match\"}").end()
}
});
只要我输入包含数字的密码,我都会得到
false
NOT VALID
user not found
很抱歉,我是否做过非常简单的事情。这是我第一次使用bcryptjs。 感谢所有的答案!
解决方法
在bcrypt的comparePassword
方法内的compare
函数的users.js文件中,您将引发错误,而不是将其传递给回调。也许您要进行此更改:
module.exports.comparePassword = function(candidatePassword,hash,callback){
bcrypt.compare(candidatePassword,function(err,isMatch) {
console.log(isMatch);
callback(err,isMatch);
});
}
当您在密码中输入数字时,您会看到这种情况会产生什么样的错误。