我有一个带有护照本地策略的Express应用程序,使用Mongoose存储用户帐户。我有一个自由职业者为我编写应用程序的这一部分,因为我无法理解如何从头到尾构建登录系统(我发现的每个教程都以不同的方式完成)。这样做的缺点是我不明白每个部分的作用。这是在我的app.js
文件中:
const Account = require('./models/db/AccountsSchema');
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(Account.authenticate()));
passport.serializeUser(Account.serializeUser());
passport.deserializeUser(Account.deserializeUser());
,这是routes/index.js
:
router.post('/register', function(req, res) {
Account.register(new Account({
username: req.body.username,
name: req.body.name
}), req.body.password, function(err, account) {
if (err) {
console.log(err);
} else {
console.log(account);
passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login'
})(req, res, function(err, user) {
res.redirect('/');
});
}
});
});
以及:
router.post('/login',
passport.authenticate('local'),
function(req, res) {
res.redirect('/');
}
);
现在在登录POST请求中我想检查具有该特定用户名的用户是否存在,这样如果密码错误,至少我可以告诉用户密码错误。用户枚举不是安全问题。
在我的代码中,我可以合并数据库检查是否存在具有指定用户名的帐户?
答案 0 :(得分:0)
在Account.authenticate()
函数中。因为它根据你的情况设置了LocalStrategy。
制定本地策略:
passport.use(new LocalStrategy(Account.authenticate()));
示例代码:
function authenticate(username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}