10

我仅将 passport.js 用于 Google、Facebook 和 Twitter 登录。

Node.js v0.8.19 与 express.js 3.1.0 和 passportjs 版本 0.1.16。(护照-facebook - 0.1.5,推特 - 0.1.4 护照-goolge-oauth - 0.1.5)

在运行 passport.js 一个小时左右的应用程序停止将用户序列化到 req.user 会话后,一切都可以正常工作一段时间。

Facebook 和 google 正在从各自的 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 从来没有走那么远,在返回回调 url 后,twitter 给出了错误:

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

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

这是我的快速应用配置

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 服务器。一切都工作了一段时间然后失败了。

4

3 回答 3

26

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

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

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

于 2013-03-15T17:05:40.877 回答
6

我仍然不明白为什么会出现问题,但我已经通过执行以下操作解决了它。

改变

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

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

我认为序列化整个用户对象应该可以工作,因为 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)  
    })
});

自从我这样做以来,我的问题为零

于 2013-03-15T16:27:34.837 回答
0

//app.use(session(...)) must comes before app.user(passport.session())
//other wise items will not be save or serialize to session


app.use(
  session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false,
  })
);


app.use(passport.session());

于 2021-07-25T08:13:48.220 回答