Express Passport无法获得facebook好友列表

时间:2014-07-11 00:26:05

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

当尝试使用Facebook api获取已验证帐户的好友列表时,除了返回的好友列表为空外,它似乎有效。

facebook.js

var https = require('https');

exports.getFbData = function(accessToken, apiPath, callback) {
    var options = {
        host: 'graph.facebook.com',
        port: 443,
        path: apiPath + '?access_token=' + accessToken, //apiPath example: '/me/friends'
        method: 'GET'
    };

    var buffer = ''; //this buffer will be populated with the chunks of the data received from facebook
    var request = https.get(options, function(result){
        result.setEncoding('utf8');
        result.on('data', function(chunk){
            buffer += chunk;
        });

        result.on('end', function(){
            callback(buffer);
        });
    });

    request.on('error', function(e){
        console.log('error from facebook.getFbData: ' + e.message)
   });

    request.end();
}

app.js

app.get('/', function (req, res) {
  if (req.session.myID != null && req.session.myName != null) {
    User.findOne({sessionID: req.session.myID, username: req.session.myName}, function (err, doc) {
      if (err) {throw err}
      else if (doc != null) {
        facebook.getFbData(doc.facebookToken, '/me/friends', function(data){
            console.log(data);
            res.render('index');
        });

      }
      else {
        //console.log("not logged in");
        res.render('index');
      }
    });
  }
  else {
    //console.log("not logged in");
    res.render('index');
  }
});

passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET',
    callbackURL: "http://localhost:3000/auth/facebook/callback",
    profileFields: ['id', 'displayName']
  },
  function(accessToken, refreshToken, profile, done) {
    User.findOne(..., function(err, user) {
      if (err) { return done(err); }
      user.facebookID = profile.id;
      user.facebookToken = accessToken;
      user.save();
      return done(null, user);
    });
  }
));

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

app.get('/auth/facebook/callback',
  passport.authenticate('facebook', { failureRedirect: '/login' }),
  function(req, res) {
    // Successful authentication, redirect home.
    res.redirect('/');
  }
);

facebook.getFbData回调中的console.log打印: {"data":[]}

1 个答案:

答案 0 :(得分:2)

此代码实际上可以正常工作。但是它不会获取整个朋友列表,只会获取也拥有该应用的朋友列表。