好吧,我已经调查了几天了,我真的不知道问题是什么。出于某种原因,身份验证失败(实际上,passportjs认为它失败了),但在我看来,一切正常。当我登录时,它会调用failureredirect url。但是当我打印出req.user对象的值时,一切都是正确的。
情况:
我在/login处有一个登录表单,其中显示了两个字段,一个用于电子邮件地址,另一个用于密码。
这是Express的设置:

var app = express();
app.configure(function () {
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'ejs');
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.session({secret: 'Idioticlargesecretekeygoeshere.'}));
    app.use(express.static(path.join(__dirname, 'public')));

    // Initialize passport
    app.use(flash());
    app.use(passport.initialize());
    app.use(passport.session());

    app.use(app.router);
});

这就是我如何配置Passport(在初始化Express之前添加到app.js中):
passport.serializeUser(function (user, fn) {
    fn(null, user.id);
});

passport.deserializeUser(function (userId, fn) {
    User.get(userId, function (err, user) {
        fn(err, user);
    });
});

passport.use(User.passwordStrategy);

这是user.passwordstrategy-method:
User.passwordStrategy = new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password'
    },
    function (username, password, fn) {
        User.authenticate(username, password, function (err, user) {
            if(err) return fn(err);
            if(user) {
                fn(null, user);
            }

            fn(null, null);
        });
    }
);

这是路由线路:
app.post('/login', passport.authenticate('local', {successRedirect: '/', failureRedirect: '/login', failureFlash: true}));

我已经测试和调试了身份验证方法,它是有效的。如果尝试登录,则输入serializeuser方法,并正确填写id。但是,由于登录不起作用,因此有些东西失败了。有人能给我一些指导吗?因为我已经尝试了我能想到的一切。我看不出我的代码和passportjs.org网站上发布的代码有什么不同。
用户数据存储在redis btw中。检索数据不是问题,因为所有正确的数据都传递给序列化方法。但是由于某种原因,在这条线路的某个地方,没有检测到正确的登录名。
我在passportjs站点上试过这个例子,而且这个例子运行正确。

最佳答案

如果fn是trueish,则您的代码将调用user两次,因此添加return可以解决此问题:

if (user) {
  return fn(null, user);
}
fn(null, null);

09-12 08:38