Nodejs - Passport 身份验证总是 return 失败重定向

Nodejs - Passport authenticate always return failure redirect

我正在通过 passportJs 制作一个表单登录,它总是 return failureRedirect。我在堆栈溢出中搜索了这个问题,但仍然没有正确的答案。这是我的代码:

路由器 Hanlde 使用 Express 框架形式的 Nodejs 和护照中间件:

passport.serializeUser(function(user, done) {
 done(null, user.id);
});

passport.deserializeUser(function(id, done) {
User.getUserById(id, function(err, user) {
    done(err, user);
});
});

passport.use(new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password'
},
function(username, password, done) {
    User.getUserByUsername(username, function(err, user) {
        if (err) throw err;
        if (!user) {
            console.log('Unknown User');
            return done(null, false, {
                message: 'Unknown User'
            });
        }

        User.comparePassword(password, user.password, function(err, isMatch) {
            if (err) throw err;
            if (isMatch) {
                return done(null, user);
            } else {
                console.log('Invalid Password');
                return done(null, false, {
                    message: 'Invalid Password'
                });
            }
         });
      });
   }
));

  router.post('/login', passport.authenticate('local', {
    failureRedirect: '/users/login',
    failureFlash: 'Invalid username or password'
}), function(req, res) {
console.log('Authentication Successful');
req.flash('success', 'You are logged in ');
res.redirect('/');
 });

查看您在评论中分享的 getUserByUsername 函数,您似乎没有以正确的方式调用 getUserByUsername 的回调函数,因此它没有获得 user 对象导致失败重定向。您分享的功能是:

module.exports.getUserByUsername = function(username, callback){
  var query = {username: username}; 
  User.findOne(query, callback); 
} 

将其更改为以下应该可以解决您的问题:

module.exports.getUserByUsername = function(username, callback){
  var query = {username: username}; 
  User.findOne(query, function(err, user) {
    callback(err, user);
  }); 
}