我从该回购https://github.com/DanialK/PassportJS-Authentication中获取了一些代码片段,并对其进行了调整,而不是使用MongoDB,而是使用MySQL。这是我检查密码的代码:
User.checkPassword = function(username, password, done) {
pool.getConnection(function(err,connection){
connection.query("SELECT * FROM " + userTable + " WHERE username=? LIMIT 1;",[username], function(err, user){
// if(err) throw err;
if(err) return done(err);
if(!user[0]){
console.log("Incorrect User")
return done(null, false, { message : 'Incorrect Username.' });
}
user = user[0];
hash(password, user.salt, function(err, hash){
hash = hash.toString("hex");
if(err) return done(err);
if(hash == user.hash){
console.log("SUCCESS!");
return done(null, user);
}
done(null, false, {
message : 'Incorrect password'
});
});
});
});
};
用于存储散列的MySQL字段是varchar(128),在将散列添加到表之前,我使用缓冲区中的toString(' hex')来存储它。哈希是使用https://github.com/visionmedia/node-pwd创建的。我的代码看起来很像教程的代码,但对于MySQL。但是当我尝试比较密码时,哈希值并不相同。为什么会这样?
这是我用来注册用户的代码:
User.cadastrar = function(username,password,done){
var User = this;
hash(password, function(err, salt, hash){
hash = hash.toString('hex');
if(err) throw err;
// if (err) return done(err);
pool.getConnection(function(err,connection){
connection.query("INSERT INTO " + userTable + " (username,salt,hash) VALUES (?,?,?);", [username,salt,hash], function(err, user){
if(err) throw err;
// if (err) return done(err);
connection.query("SELECT * FROM " + userTable + " WHERE username=? LIMIT 1;",[username], function(err,user){
done(null, user[0]);
});
});
connection.release();
});
});
}