Express.js Passportjs和未经授权的用户

时间:2013-12-30 19:01:53

标签: node.js redis passport.js unauthorized

好的,我已经研究了几天了,我真的不知道问题是什么。由于某种原因,身份验证失败(实际上,Passportjs认为它失败了),但在我看来一切正常。当我登录时,它会调用failureRedirect-url。但是当我打印出req.user对象的值时,一切都是正确的。

情况: 我在/ login有一个登录表单,其中显示了2个字段,一个用于电子邮件地址,另一个用于密码。

这是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);
});

这是我配置护照的方式(在快递初始化之前添加到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网站上尝试了这个例子,并且该网站运行正常。

1 个答案:

答案 0 :(得分:1)

如果fn是真的,您的代码会调用user两次,因此添加return可能会解决此问题:

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