具有自定义回调的Passport本地策略永远不会起作用

时间:2015-10-13 19:02:50

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

我在Passport上遇到了太多困难,因为自定义回调功能根本不起作用。这是我如何初始化护照:

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var bodyParser = require('body-parser');

// Set up passport
passport.use('local', new LocalStrategy({
    usernameField: 'userId',
    passwordField: 'password'
}, function (userId, password, cb) {
    users.findByUserId(userId, function (err, user) {
        if (err) {
            return cb(err);
        }
        if (!user) {
            return cb(null, false);
        } else {
            if (user.password !== password) {
                return cb(null, false);
            }
            return cb(null, user);
        }
    });
}));
passport.serializeUser(function (user, cb) {
    cb(null, user.userId);
});
passport.deserializeUser(function (id, cb) {
    users.findByUserId(id, function (err, user) {
        if (err) { return cb(err); }
        cb(null, user);
    });
});

然后,当用户发布到' / login'时,这就是用户登录的方式:

exports.tryLogin = function (req, res, next) {
    passport.authenticate('local', function(err, user, info) {
        if (err) { return res.status(500).json({ success : false, message : 'Internal server error: ' + err.message }); }
        if (!user) { return res.status(500).json({ success : false, message : 'user not found'}); }
        req.logIn(user, function(err) {
          if (err) { return res.status(500).json({ success : false, message : 'Internal server error: ' + err.message }); }
          return res.status(200).json({ success : true });
        });
      })(req, res, next);
}

这是我必须这样做的原因,因为它从未检测到用户。用户'在上面的方法总是未定义。我必须自己构建它以使其工作:

exports.tryLogin = function (req, res, next) {
    var user = {
        userId: req.body.userId,
        password: req.body.password
    }
    req.logIn(user, function (err) {
        if (err) {
            return res.status(500).json({ success : false, message : 'Internal server error: ' + err.message });
        }
        return res.status(200).json({ success : true, message : 'authentication succeeded' });
    });
}

这很有效,但感觉不对,因为我从不打电话给passport.authenticate。这是正常的,还是我应该试着让自定义回调按照文档中的定义工作??/ / p>

萨姆

1 个答案:

答案 0 :(得分:1)

是的,这是错误的方法。

此代码表示:

exports.tryLogin = function (req, res, next) {
    var user = {
        userId: req.body.userId,
        password: req.body.password
    }
    req.logIn(user, function (err) {
        if (err) {
            return res.status(500).json({ success : false, message : 'Internal server error: ' + err.message });
        }
        return res.status(200).json({ success : true, message : 'authentication succeeded' });
    });
}

你没有检查权限,你几乎没有密码检查登录任何人。