2013-07-26 10 views
2

訪問Facebook生日,家鄉和其他數據與passportJS在節點我試圖添加OAuth2登錄到我的應用程序構建在Node/ExpressJS/MongoDB/PassportJS。在節點

我可以使用此方法成功登錄,但無法獲取某些信息。我已經能夠訪問的唯一的東西是email,namefbId字段 - 我目前無法訪問here的生日,喜歡,家鄉和其他信息。

我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 

我試圖訪問它們不正確?我在這裏做錯了什麼?

回答

1

我找到了解決方案。這是我原來的電話給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

JSON配置文件包含很多可以訪問的數據。尤其是家鄉可以通過

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

我建議瞭解

profile 

結構添加

console.log(profile); 

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

你給出的命令之前進行訪問爲newuser.xxx = profile.xxx;這將在您的控制檯上打印配置文件的結構,然後您可以閱讀該配置文件以瞭解如何訪問相關字段。