8

I'm trying to do my first steps with the Express framework for Node. I was trying to implement a tiny authentication example, using Passport. However, I can't make it work; I keep getting the error: Error: failed to serialize user into session.

I installed node-inspector to try to see what's going on. Apparently, my serialization function is being called, and it executes done(null, 0) as expected. I tried taking a look at Passport code, but I couldn't understand what the problem is. This is pretty much my first attempt at a Node application so I'm not familiar with the code. Can someone give me a hint? Thanks.

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.');
4

2 回答 2

11

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

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

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

done(null, 0.toString())
于 2012-10-23T17:46:10.343 回答
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());

});
于 2012-10-23T06:43:22.517 回答