传递inputModel而不是请求护照策略

时间:2015-02-06 07:41:43

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

我正在使用这样的护照本地策略:

配置:

passport.use(new LocalStrategy({
        usernameField: 'email'
    },
    function(email, password, done) {
        UserPersistenceModel.findOne({ email: email }, function (err, user) {
            if (err) return done(err);
            if (!user) return done(null, false);
            user.comparePassword(password, function(err, isMatch) {
                if(err) return done(err);
                if(!isMatch) return done(null, false);
                return done(null, user);
            });
        });
    }
));

我的路由器定义如下:

var TokenRouter = function(app, passport, tokenSecret) {
    //Create
    app.post('/', function(req, res, next) {
        console.log(req.body);
        passport.authenticate('local', function(err, user, info) {
            if (err) return next(err);
            if (!user) {
                console.log('Unsuccessful login!');
                return res.status(401).json({ error: 'Login failed!' });
            }
            req.logIn(user, function(err) {
                if (err) return next(err);
                console.log('Successful login!');

                //user has authenticated correctly thus we create a JWT token
                var token = jwt.encode(user, tokenSecret);
                res.json({ output : token });
            });
        })(req, res, next);
    });
};

由于某些原因,我不完全理解护照“机制”。该文档对我来说看起来并不是非常详细。一个问题是请求对象(包含包含电子邮件和密码的正文)传递给我的策略。策略如何获取电子邮件和密码(什么是“源对象”)?

问这个的原因是我想使用以下inputModel而不是传递给策略的请求:

var TokenCreateInputModel = function(req) {
    this.email = req.body.email;
    this.password = req.body.password;

    this.validate();
};
TokenCreateInputModel.prototype = Object.create(InputModel);

TokenCreateInputModel.prototype.validate = function() {
    if(!this.email) throw new Error('Email is required!');
    if(this.email.indexOf('@') == -1) throw new Error('Emailsyntax is wrong!');

    if(!this.password) throw new Error('Password is required!');
};

module.exports = TokenCreateInputModel;

此输入模型正在转换请求并验证数据。我想使用这个输入模型,因为它更适合我的架构(我在所有其他情况下使用这样的inputModels ......只是没有护照(因为缺乏我的理解),这似乎与我不一致。

0 个答案:

没有答案