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

Pab*_*nio 8 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.');
Run Code Online (Sandbox Code Playgroud)

Jar*_*son 11

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

done(null, 0)  // don't serialize users to a 0 number
Run Code Online (Sandbox Code Playgroud)

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

done(null, 0.toString())
Run Code Online (Sandbox Code Playgroud)


Oli*_*nde 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());

});
Run Code Online (Sandbox Code Playgroud)