护照回调未被调用

时间:2017-08-10 13:06:51

标签: javascript passport.js

我使用Passport lib(部分内容)使用this tutorial构建应用程序。

注意,我不需要注册,只需要登录表单。

其中一个问题是我的 LocalStrategy 回调永远不会被调用。对于存储,我使用mongo:

mongoose.connect(dbConfig.url, {
    useMongoClient: true
});

//dbConfig

module.exports = {
    'url' : 'mongodb://localhost/passport'
}

登录路线如下:

module.exports = function(app, passport) {
    app.get('/login', function(req, res) {
        res.render('login', {
            message: req.flash('loginMessage')
        });
    });

    app.post('/login', passport.authenticate('login', {
        successRedirect: '/', // redirect to the secure profile section
        failureRedirect: '/login', // redirect back to the signup page if there is an error
        failureFlash: true // allow flash messages
    }));
}

Passport逻辑是:

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

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

    passport.use('login', new LocalStrategy({
        passReqToCallback: true 
    }, function(req, username, password, done) {
        console.log('start'); // never called

        User.findOne({
            'local.email': email
        }, function(err, user) {
            if (err) {
                return done(err);
            }

            if (!user) {
                return done(null, false, req.flash('loginMessage', 'No user found.'));
            }

            if (!user.validPassword(password)) {
                return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.'));
            }

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

console.log('start'); 永远不会被调用,但会调用 passport.authenticate('login'...)

可能是什么问题?

1 个答案:

答案 0 :(得分:0)

我终于修好了,一切正常。如果有人遇到同样的问题我会在这里发布几个问题和解决方案。

我的 app.post 中的 req.body 为空,因为我没有添加正文解析器。修正了:

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

用户名字段一直是空的,因为我将其命名为电子邮件,并将护照命名为用户名。修正:

new LocalStrategy({
        usernameField: 'email', // this parameter
        passReqToCallback: true
    }