NodeJS、护照和本地护照

NodeJS, Passport & Passport-Local

所以我 运行 遇到了使用本地策略进行身份验证的问题。如果我传递了无效的凭据或任何不成功的东西,我会得到相应的错误。但是,如果他们身份验证成功,则会出现 404 错误。

我四处寻找,我 运行 发现的最好的想法是删除会话存储(这似乎是它发生的地方,同时序列化用户)。有人遇到过这样的问题吗?

这是部分代码,如果您需要任何其他部分的代码,请告诉我,我们很乐意提供。

我的 Passport 配置:

var passport = require('passport'),
User = require('mongoose').model('User');

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

    passport.deserializeUser(function (id, done) {
        User.findOne({ _id: id }, '-password -salt -__v', function (err, user) {
            done(err, user);
        });
    });

    require('./strategies/local')();
};

我的本地策略配置:

var passport = require('passport'),
    LocalStrategy = require('passport-local').Strategy,
    User = require('mongoose').model('User');

module.exports = function () {
    passport.use(new LocalStrategy({
        usernameField: 'email'
    }, function (email, password, done) {
        User.findOne({email: email}, function (err, user) {
            if (err) {
                return done(err);
            }

            if(!user || !user.active || !user.authenticate(password)) {
                return done(null, false, { message: 'Authentication Failed'});
            }

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

所有其他方法都有效,我可以查询数据库以找到用户,我已经逐步将散列密码与提供的密码进行匹配,一切似乎都很好,我在 LocalStrategy 的末尾获得了一个用户(我进入了决赛 done(null, user)。在 serializeUser() done(null, user.id) 中发生了一些事情。我已经尝试逐步完成它,但我最终进入的内容似乎相当混乱(或者我'我太笨了,看不懂)所以我不知道到底发生了什么。

这是您的路线设置:

app.route('/login').post(passport.authenticate('local'));

这将在身份验证失败时生成 401 ("Unauthorized"),但当它成功时,没有配置接下来要发生的任何事情,因此您将收到 404.

您应该向您的路线添加一个明确的 "success" 处理程序:

app.route('/login').post( 
  passport.authenticate('local'),
  function(req, res) {
    // This will only get called when authentication succeeded.
    res.json({ user : req.user });
  }
);