我正在尝试使用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.');
答案 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());
});