检查用户是否存在本地护照

时间:2016-06-14 14:14:03

标签: node.js express passport.js passport-local

我有一个带有护照本地策略的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请求中我想检查具有该特定用户名的用户是否存在,这样如果密码错误,至少我可以告诉用户密码错误。用户枚举不是安全问题。

在我的代码中,我可以合并数据库检查是否存在具有指定用户名的帐户?

1 个答案:

答案 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);
    });
  }