【问题标题】:Passport.js failing to serialize userPassport.js 无法序列化用户
【发布时间】:2013-02-27 08:16:38
【问题描述】:

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

Node.js v0.8.19 与 express.js 3.1.0 和 passportjs 版本 0.1.16。 (passport-facebook - 0.1.5, twitter - 0.1.4 passport-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会成功打印用户名和用户名,但是调用后

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

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

序列化和反序列化取自passport-facebookexample.

用户不会被附加到 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 服务器。一切都工作了一段时间然后失败了。

【问题讨论】:

  • passport.serializeUser() 或 deserializeUser() 看起来都无法正常工作。 serializeUser() 应该获取一个对象并将其序列化为一个字符串,该字符串可用于 cookie 以唯一标识用户。这通常通过调用done(null, user.id) 来完成。 deserializeUser 应该采用相同的 id(来自 cookie)并在数据库中找到正确的数据集。使用 mongodb 你可以做到User.findById(id, function(err, user) { done(err, user); });
  • 所以它们一定是字符串?
  • Here 在 passport-facebook 示例中,它们具有与我相同的序列化和反序列化。
  • 嗯...现在我不确定。我没有特别使用 facebook 策略,但我认为它应该总是一样的。 In passport's own docsserializeUser 返回一个字符串(顾名思义),所以我敢打赌,护照-facebook 的文档是错误的。如果您不返回发送给 serializeUser 的内容之外的其他内容,则这些方法实际上不会做任何事情。
  • @JohnEcho 您正在使用maxAge,就好像它是expires,这可能是问题所在。 maxAge 应该传递会话过期的毫秒数(而 expires 需要一个时间戳,如您的代码中所示)

标签: node.js express passport.js


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    变化

      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)  
        })
    });
    

    自从我这样做以来,我遇到了个问题。

    【讨论】:

    • 不确定这是否真的是问题,但我认为 cookie 上的 maxAge 应该是 cookie 应该持续的秒数,而不是它应该过期的实际时间(这就是你放在那里的东西)。
    【解决方案3】:

    //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());

    【讨论】:

      猜你喜欢
      • 2018-10-22
      • 2013-11-25
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多