3

我正在尝试将 OAuth2 登录添加到基于 Node/ExpressJS/MongoDB/PassportJS 构建的应用程序中。

我可以使用此方法成功登录,但我无法获取某些信息。我能够访问的唯一内容是email,namefbId字段 - 我目前无法从这里访问生日、喜欢、家乡和其他信息。

我的 userSchema 设置如下:

var userSchema = new mongoose.Schema({
    fbId: String,
    name: String,
    email: { type:String, lowercase: true },
    gender: String,
    birthday: String,
    hometown: Object,
    location: Object,
    likes: Array
});

这是在我的 Express 服务器上运行的代码:

passport.use(new FacebookStrategy({
    clientID: config.development.fb.appId,
    clientSecret: config.development.fb.appSecret,
    callbackURL: config.development.fb.url + 'fbauthed'
  },
  function(accessToken, refreshToken, profile, done) {
    process.nextTick(function() {
      var query = User.findOne({ 'fbId': profile.id });
      query.exec(function(err, oldUser) {
        if (oldUser) {
          console.log('Existing user: ' + oldUser.name + ' found and logged in!');
          done(null, oldUser);
        } else {
          var newUser = new User();
          newUser.fbId = profile.id;
          newUser.name = profile.displayName;
          newUser.email = profile.emails[0].value;
          newUser.gender = profile.gender;
          newUser.birthday = profile.birthday;
          newUser.hometown = profile.hometown;
          newUser.location = profile.location;
          newUser.likes = profile.likes;

          newUser.save(function(err) {
            if (err) { return done(err); }
            console.log('New user: ' + newUser.name + ' created and logged in!');
            done(null, newUser);
          });
        }
      });
    });
  }
));
app.get('/fbauth', passport.authenticate('facebook', { scope: 'email' }));
app.get('/fbauthed', passport.authenticate('facebook',{ failureRedirect: '/' }), function(req, res){}

当我尝试登录并尝试访问这些属性时,我得到:

fbId: String, // Defined
name: String, // Defined
email: { type:String, lowercase: true }, // Defined
gender: String, // Defined
birthday: String, // UNDEFINED
hometown: Object, // UNDEFINED
location: Object, // UNDEFINED
likes: Array // UNDEFINED

我是否试图错误地访问它们?我在这里做错了什么?

4

2 回答 2

3

我找到了解决方案。这是我最初对 facebook 的调用,在这里:

app.get('/fbauth', passport.authenticate('facebook', { scope: 'email' }));

scope部分是您从用户那里获得身份验证的内容。如果您查看文档,您会看到“生日”需要user_birthday和“喜欢”需要user_likes。所以这就是我必须做的:

app.get('/fbauth', passport.authenticate('facebook', { scope: ['email', 'user_birthday', 'user_likes'] }));

然后,我从我的 facebook 帐户中对应用程序进行了未经身份验证,从我的数据库中删除了我的用户个人资料,注销并重新启动身份验证,它工作得很好。上述建议console.log(profile)很好,因为它可以帮助您查看 Facebook 实际发送回的数据。

于 2013-07-26T14:41:49.873 回答
1

JSON 配置文件包含大量可以访问的数据。特别是家乡可以通过

newuser.hometown= profile._json.hometown.name;

我建议了解的结构

profile

你加

console.log(profile);

process.nextTick(function() {
 console.log(profile);
}

在你给出 newuser.xxx = profile.xxx 的命令之前;这将在您的控制台上打印配置文件的结构,然后您可以阅读以了解如何访问相关字段。

于 2013-07-26T08:47:24.617 回答