authentication - 登录使用任何密码对用户进行身份验证
问题描述
我创建了一个简单的登录表单。只要密码字段中有内容,它似乎就可以对任何现有用户进行身份验证。显然,这是一个巨大的安全漏洞。我是新来的意思是堆栈和使用护照来验证用户似乎很容易,但不确定我是否做错了。
这是我使用passportjs的后端代码:
应用程序.js
const passport = require('passport');
require('./config/passport');
app.use(passport.initialize());
路线/index.js
const ctrlAuth = require('../controllers/authentication');
router.post('/login', ctrlAuth.login);
控制器/authentication.js
module.exports.login = function(req, res) {
passport.authenticate('local', function(err, user, info){
let token;
// If Passport throws/catches an error
if (err) {
res.status(404).json(err);
return;
}
// If a user is found
if(user){
token = user.generateJwt();
res.status(200);
res.json({
"token" : token
});
} else {
// If user is not found
res.status(401).json(info);
}
})(req, res);
};
最后,我的配置文件
配置/passport.js
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const User = mongoose.model('User');
passport.use(new LocalStrategy({
usernameField: 'email'
},
function(username, password, done) {
User.findOne({
email: username
}, function(err, user) {
if (err) {
return done(err);
}
//Return if user not found in database
if (!user) {
return done(null, false, {
message: 'User not found'
});
}
//Return if password is wrong
if (!user.validPassword(password)) {
return done(null, false, {
message: 'Password is wrong'
});
}
//If credentials are correct, return the user object
return done(null, user);
});
}
));
我相信我已经将错误缩小到我的 validPassword 函数,在那里我可能错误地使用了 bcrypt。
userSchema.methods.validPassword = function(password){
return bcrypt.compare(password, this.hash);
};
解决方案
我将问题缩小到我的 validPassword 方法,发现我使用 bcrypt 不正确。将其更改为
userSchema.methods.validPassword = function(password){
return bcrypt.compareSync(password, this.hash);
};
查看 bcrypt 的文档后更有意义https://github.com/kelektiv/node.bcrypt.js#readme
推荐阅读
- amazon-web-services - 无法使用 AWS codepipeline 部署 github 示例代码
- filesystems - 为什么 QNX 2 分区是非 QNX 分区的示例?
- azure - 移入网络安全组的 Azure 函数变空
- powershell - 将 x509 证书重新分发到不同的商店
- java - 如何从多对多获取数据或查询?
- python - 为什么 time.asctime(time.gmtime()) 忽略 GMT?
- xcode - 在 Xcode 10.1 上运行 iOS 12.3.1 模拟器
- rest - 当我们检查接收时间更长时,带有 $search 过滤器的 Microsoft Graph 邮件 API 不起作用
- html - ConvertTo-HTML 从 PSObject 输出 System.Object[]
- jenkins - 使用 JsonBuilder 的 toPrettyString 时出现 StackOverflowError