错误:无法将用户序列化为会话。错误的函数传递给serializeUser()?

时间:2012-10-22 09:53:30

标签: node.js express passport.js

我正在尝试使用Express框架进行Node的第一步。我试图使用Passport实现一个微小的身份验证示例。但是,我无法使其发挥作用;我一直收到错误:Error: failed to serialize user into session

我安装了node-inspector来试着看看发生了什么。显然,我的序列化函数被调用,它按预期执行done(null, 0)。我试过看看Passport代码,但我无法理解问题是什么。这几乎是我第一次尝试Node应用程序,所以我不熟悉代码。有人能给我一个暗示吗?感谢。

var express = require('express');
var jade = require('jade');

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

var app = express();

/*
 * Settings
 */

app.configure(function(){
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');

    app.use(express.logger());
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.session({ secret: 'cat in the bag' }));
    app.use(passport.initialize());
    app.use(passport.session());

    passport.use(new LocalStrategy(
        function(username, password, done) {
            done(null, { id: 0, username: 'juancito' });
        }
    ));

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

    passport.deserializeUser(function(id, done) {
        done(null, 'juancito');
    });
});



/*
 * Routes
 */

app.get('/', function(req, res) {
    res.render('index', { title: 'Welcome!' });
});

app.get('/login', function(req, res) {
    if (req.user)
        return res.redirect('/');

    res.render('login', { title: 'Log in' });
});

app.post('/login',
    passport.authenticate('local', {
        successRedirect: '/',
        failureRedirect: '/login'
    })
);

app.get('/logout', function(req, res) {
    req.logOut();
    res.redirect('/');
});

app.listen(3000);
console.log('Listening on port 3000.');

2 个答案:

答案 0 :(得分:11)

问题是0在JavaScript中是假y值,因此Passport认为您没有序列化您的用户。

done(null, 0)  // don't serialize users to a 0 number

我建议将用户ID设置为1(在SQL数据库中发生),或者(如果你真的需要从0开始的整数)将它们序列化为会话的字符串。

done(null, 0.toString())

答案 1 :(得分:5)

也许你应该在调用passport.initialize()和passport.session()之前分配你的序列化/反序列化回调。

passport.use(new LocalStrategy(
    function(username, password, done) {
        done(null, { id: 0, username: 'juancito' });
    }
));

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

passport.deserializeUser(function(id, done) {
    done(null, 'juancito');
});

app.configure(function(){
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');

    app.use(express.logger());
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.session({ secret: 'cat in the bag' }));
    app.use(passport.initialize());
    app.use(passport.session());

});