在Border中使用passportJS访问Facebook生日,家乡和其他数据

时间:2013-07-26 00:07:19

标签: facebook facebook-graph-api express oauth passport.js

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

我可以使用此方法成功登录,但我无法获得某些信息。我能够访问的唯一内容是emailnamefbId字段 - 我目前无法访问来自here的生日,喜欢,家乡和其他信息。< / p>

我的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

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

2 个答案:

答案 0 :(得分:3)

我找到了解决方案。这是我原来打电话给facebook,在这里:

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

scope部分是您从用户那里获得身份验证的内容。如果看上去at the documentation,您会看到“生日”需要user_birthday而“喜欢”需要user_likes。所以这就是我必须做的事情:

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

然后我从我的Facebook帐户中取消了该应用程序的未经身份验证,从我的数据库中删除了我的用户配置文件,注销并重新启动了身份验证,它运行正常。上述做console.log(profile)的建议很好,因为它可以帮助您查看Facebook实际发回的数据。

答案 1 :(得分:1)

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

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

我建议理解

的结构
profile

你添加

console.log(profile);

in

process.nextTick(function() {
 console.log(profile);
}
在给出newuser.xxx = profile.xxx的命令之前

;这将在您的控制台上打印配置文件的结构,然后您可以阅读该配置文件以了解如何访问相关字段。