Passport.js无法序列化用户

我只为Google,Facebook和Twitterlogin使用passport.js。

Node.js v0.8.19与express.js 3.1.0和passportjs版本0.1.16。 (护照 – 脸书-0.1.5,推特 – 0.1.4护照 – 眼睛 – 奥法 – 0.1.5)

一切运行正常,一小时左右的应用程序运行passport.js停止序列化用户进入req.user会话。

Facebook和谷歌正在从各自的API接收全部数据的含义

passport.use(new FacebookStrategy({ clientID: FACEBOOK_APP_ID, clientSecret: FACEBOOK_APP_SECRET, callbackURL: "http://localhost:3000/auth/facebook/callback" }, function(accessToken, refreshToken, profile, done) { var temp = {} temp.name = profile.displayName temp.id = profile.id console.log(temp) return done(null, temp); })); 

这里console.log将成功打印用户ID和名称,但是在调用之后

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

序列化和反序列化取自passport-facebook 示例。

用户不会被连接到req.user。

Twitter在返回到callback链接之后永远不会那么远,twitter会给出错误:

 Error: failed to find request token in session [03/11 23:28:24 GMT] at Strategy.OAuthStrategy.authenticate 

注意:这些故障只发生一段时间后,正常工作一段时间。 这就是为什么我认为这可能是一个内存问题,就像我将会话保存在内存而不是cooke。

这是我的快速应用程序configuration

 app.configure(function(){ app.set('port', process.env.PORT || 8080); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.cookieParser()); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieSession({ secret: 'tobo!', cookie: { maxAge: new Date(Date.now() + 3600000), }})); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(express.static(__dirname + '/public')); }); 

我看了邮件列表等,但我找不到匹配这个问题的东西。 我检查了我的本地主机和nodejitsu服务器上。 一切正常,然后失败。

首先,您必须了解序列化和反序列化的含义。

1) serializeUser根据你的第一个问题获取一个用户对象并在会话中存储你想要的任何信息,当你返回done(null, user)

2) deserializeUser将会话中存储的信息(由cookieSession在每个请求中发送)并检查会话对用户是否仍然有效, if(!err) done(null,user)为真,则保持用户在会话中, else done(err,null)将它从会话中删除,redirect到任何你的app.get('/auth/:provider/callback')在检查会话是否超时之后发送给用户。 这应该澄清你的第二个问题。

我仍然不明白为什么会出现这个问题,但我已经通过下面的方法解决了这个问题。

更改

  app.use(express.cookieSession({ secret: 'tobo!', cookie: { maxAge: new Date(Date.now() + 3600000), }})); 

 app.use(express.cookieSession({ secret: 'tobo!', maxAge: 360*5 })); 

我认为序列化整个用户对象应该工作,因为反序列化用户将只传回传递的cookie。 但是通过不序列化它正在工作的整个用户对象。

 passport.serializeUser(function(user, done) { console.log('serializeUser: ' + user._id) done(null, user._id); }); passport.deserializeUser(function(id, done) { db.users.findById(id, function(err, user){ console.log(user) if(!err) done(null, user); else done(err, null) }) }); 

自从我这样做以来,我一直没有问题。