使用 passport.js LocalStrategy 再进行一次字段验证

One more field validation using passport.js LocalStrategy

我正在使用 passport.js LocalStrategy 来验证用户名和密码。但现在我还有一个要验证的字段,即 active: true/false(用户是否处于活动状态)。下面的代码显示了用户名和密码的验证。

app.js

passport.use(new LocalStrategy({
    usernameField: 'username', 
    passwordField: 'password'},
    function(username, password, done) {
        User.findOne({ name : username}, function(err, user) {
            if (!user){
                return done(null, false,{message: 'Incorrect username' });
            } 

            if(user){
                var validPassword = user.comparePassword(password);

                if(!validPassword){
                    return done(null, false,{message: 'Incorrect password' });
                }
            }           
            return done(null, user);
        });       
    }
));

router.post('/pages/auth/login', function(req, res, next) {
    passport.authenticate('local', function(err, user, info) {
        if (user === false) {
            return res.json({
                success:false,
                message: info.message,
            });
        } else {
            req.login(user, function(err) {
                return res.json({
                    success:true,
                    Id:req.sessionID,
                    userName:req.body.username,
                    Email:req.user.email,
                    uid:req.user._id,
                    mobile:req.user.mobile,
                });
            });         
        }
    })(req, res, next);
});

我的 collection 看起来像下面 mongoDB

{
  "_id": ObjectId("57921ce8f8a10f644ababf2d"),
  "name": "abc",
  "email": "abc@gmail.com",
  "password": "32432423#fds#yy&1233S&dr&@",
  "mobile": "9886787560",
  "generatedOtp": "270371",
  "active": false,
  "__v": NumberInt(0) 
}

现在它将检查用户名和密码是否正确然后登录,否则将显示该消息。像这样我也想检查 active 字段。请帮助我。

下面的代码应该符合您的需要。
请注意,我在检查密码之前还删除了检查 if (user) { ...,因为这不是必需的。如果 user 将是 null / undefined 那么你的代码将不会达到那个点,因为你第一次检查 if (!user) { ... which returns from the function in that case .

passport.use(new LocalStrategy({
    usernameField: 'username', 
    passwordField: 'password'},
    function(username, password, done) {
        User.findOne({ name : username}, function(err, user) {
            if (!user){
                return done(null, false,{message: 'Incorrect username' });
            } 

            if (!user.active) {
                return done(null, false, {message: 'User is inactive'});
            }

            var validPassword = user.comparePassword(password);
            if(!validPassword){
                return done(null, false,{message: 'Incorrect password' });
            }

            return done(null, user);
        });       
    }
));