Passport.js无法序列化用户

Eoi*_*ray 10 node.js express passport.js

我只使用passport.js进行谷歌,Facebook和Twitter登录.

Node.js v0.8.19 with express.js 3.1.0,passportjs version 0.1.16.(passport-facebook - 0.1.5,twitter - 0.1.4 passport-goolge-oauth - 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);
}));
Run Code Online (Sandbox Code Playgroud)

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

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

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});
Run Code Online (Sandbox Code Playgroud)

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

用户不会被附加到req.user.

Twitter从未走得那么远,在回到回调网址后,twitter给出了错误:

Error: failed to find request token in session
[03/11 23:28:24 GMT]     at Strategy.OAuthStrategy.authenticate            
Run Code Online (Sandbox Code Playgroud)

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

这是我的快速应用程序配置

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'));
});
Run Code Online (Sandbox Code Playgroud)

我查看了邮件列表等,但我找不到符合此问题的内容.我已经检查了我的localhost和nodejitsu服务器.一切都工作了一段时间然后失败.

Mar*_*cel 26

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

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

2)deserializeUser获取存储在会话中的信息(由cookieSession在每个请求中发送)并检查会话是否仍然对用户有效,并且if(!err) done(null,user)为true,将用户保留在会话else done(err,null)中,从会话中删除它,将您重定向到无论你的app.get('/auth/:provider/callback')用户发送到如果会话超时或不经过检查.这应该澄清第二个问题.


Eoi*_*ray 6

我仍然不明白为什么会出现这个问题,但我通过以下方式解决了这个问题.

更改

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

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

我认为序列化整个用户对象应该有效,因为deserializeUser只会传回传递的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)  
    })
});
Run Code Online (Sandbox Code Playgroud)

我曾零个问题,因为我这样做.

  • 不确定这是否确实是问题所在,但我认为 cookie 上的“maxAge”应该是 cookie 应该持续的秒数,而不是它应该过期的实际时间(这是你放在那里的时间)。 (2认同)