Google身份验证:无法将用户序列化为会话

时间:2013-03-27 09:01:25

标签: javascript node.js express passport.js

我正在尝试使用PassportJS进行一些基本的Google身份验证。 网络上的信息量似乎相当有限,我一直在讨论问题,所以我想在这里试试。

我正在使用https://github.com/mattgaidica/twitter-mongo中的代码进行一些修改以将其用于Google OAuth(它不使用Twitter密钥,它使用passport-google,passport.authenticate('google', ...))。

我最后还是遇到了这个错误:'Error: failed to serialize user into session'

passport.serializeUser(function(user, done) {
  console.log(user); //does not have the fields we created earlier, user.uid does not exist.
  done(null, user.uid);
});

我的护照策略:

passport.use(new GoogleStrategy({
    returnURL: "http://localhost:3000/auth/google/callback"
  },
  function(identifier, profile, done) {
    User.findOne({uid: profile.id}, function(err, user) {
      if(user) {
        done(null, user);
      } else {
        var user = new User();
        user.provider = "google";
        user.uid = identifier;
        user.name = profile.displayName;
        user.save(function(err) {
          if(err) { throw err; }
          done(null, user);
        });
      }
    })
  }
));

这个其他用户的字段与最初创建的字段不同,其他用户发生了什么?

我对这里发生的事情感到有点迷茫,如果有人能让我知道我做错了什么我会非常感激。

1 个答案:

答案 0 :(得分:1)

在您的查询中,您使用profile.id

User.findOne({uid: profile.id}, function(err, user) { ... });

但那应该是identifier

此外,您正在使用Passport版本的Passport Google插件,该插件相当陈旧(甚至在节点0.10上也无法正常工作)。我建议你改用passport-google-oauth