Passport authenticate一直在执行failureRedirect

Passport authenticate is always executing failureRedirect

我正在使用 passport.js 为我的应用程序的 node.js 后端验证用户。以下代码始终执行 failureRedirect,我无法找到原因。没有错误信息。

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

我从护照网站复制了这段代码,但它也不起作用:

router.post('/login', passport.authenticate('local', { successRedirect: '/',
                                                failureRedirect: '/users/login' }));

以下代码甚至没有开始:

passport.use(new localStrategy({
                            email: 'email',
                            password: 'password'
                            }, function(email, password, done) {
User.getUserByEmail(email, 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'
            });
        }
    });
});
}));

其余相关代码:

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

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


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

module.exports.getUserById = function(id, callback){
  User.findById(id, function(err, user) {
    callback(err, user);
  }); 
}

module.exports.comparePassword = function(userPassword, hash, callback){
  console.log("pwd: " + userPassword + " hash: " + hash);
  bcrypt.compare(userPassword, hash, function(err, isMatch) {
    if(err) return callback(err);
    callback(null, isMatch);
  });
}

尝试通过 this one

更改您的 localStrategy 配置

express 使用的默认登录变量名称是 'username' 和 'password'。如果必须更改它们,如上例中的 'email',则应按以下方式修改代码:

passport.use(new localStrategy({usernameField: 'email'}, function(username, password, done){
  User.getUserByEmail(username, function(err, user){
  //rest of the code

在用户名字段没有变化的情况下,localStrategy 搜索 'username' 但它没有找到它,因此它重定向。现在,当更改 usernameField 时,它会找到 'email' 并使用它代替 username 来进行身份验证。