17

我可以通过 passport-facebook 检索基本用户信息,遵循以下代码并保存在 mongodb 中:

app.get("/auth/facebook", passport.authenticate("facebook", { scope : ["email", "publish_stream", "user_location", "user_hometown", "user_birthday", "read_friendlists"]}));

app.get("/auth/facebook/callback", passport.authenticate("facebook",{ successRedirect: '/', failureRedirect: '/'}));

var mongoose = require('mongoose'), 
FacebookStrategy = require('passport-facebook').Strategy, 
Users = mongoose.model('Users');

module.exports = function (passport, config) { 
passport.serializeUser(function(user, done) { 
    done(null, user.id);
}); 

passport.deserializeUser(function(id, done) { 
    Users.findOne({ _id: id }, function (err, user) { 
        done(err, user); 
    });
});

passport.use(new FacebookStrategy({ 
    clientID: config.facebook.clientID,
    clientSecret: config.facebook.clientSecret,
    callbackURL: config.facebook.callbackURL 
}, function(accessToken, refreshToken, profile, done) { 
    Users.findOrCreateFaceBookUser(profile, done);
}));};

但是,我无法在“个人资料”中看到个人资料图片。

文档https://github.com/jaredhanson/passport-facebook说要检索照片,我们需要传递 profileFields,如下所示。但是这样做,我可以看到照片 URL,但会丢失 _json 中包含的其他数据,例如 profile._json.location.name。如何检索完整的其他用户信息的照片?

passport.use(new FacebookStrategy({
// clientID, clientSecret and callbackURL
profileFields: ['id', 'displayName', 'photos', ....]},// verify callback));
4

5 回答 5

26

如果您需要更大的图像(上面 miksii 示例中的默认值为 50px x 50px,非常小),请使用:

profileFields: ['id', 'displayName', 'name', 'gender', 'picture.type(large)']

接着

picture: profile.photos ? profile.photos[0].value : '/img/faces/unknown-user-pic.jpg'

这将为该用户返回 200 像素 x 200 像素的个人资料图片。

于 2016-03-12T12:04:21.147 回答
16

除了回答你的问题 - 你不必那样做。正如您所提到的,您可以为 Facebook 个人资料定义所需的属性:

  clientID: "...",
  clientSecret: "...",
  callbackURL: "...",
  profileFields: ['id', 'displayName', 'name', 'gender', ..., 'photos']

你能做的只是简单地获取给定属性的值。假设您要创建一个包含该值的属性:

picture: profile.photos ? profile.photos[0].value : '/img/faces/unknown-user-pic.jpg'

这被证明是一个更好的解决方案,因为某些用户或有时用户名的值可能是未定义的。

我希望你也觉得这很有用,

谢谢你。

于 2015-01-24T23:53:23.340 回答
9

是的,可以使用这样的访问令牌通过图形 api 访问图片。“graph.facebook.com/”;+ profile.username + "/picture" + "?width=200&height=200" + "&access_token=" + accessToken; 无需使用配置文件字段。

于 2014-04-21T18:18:24.297 回答
1

作为这个答案,使用此代码会更好。

passport.use(new FacebookStrategy({
  clientID: FACEBOOK_APP_ID,
  clientSecret: FACEBOOK_APP_SECRET,
  callbackURL: FACEBOOK_APP_CALLBACK,
  profileFields: ['id', 'displayName', 'picture.type(large)', 'email', 'birthday', 'friends', 'first_name', 'last_name', 'middle_name', 'gender', 'link']
}, (accessToken, refreshToken, profile, cb) => {
  const picture = `https://graph.facebook.com/${profile.id}/picture?width=200&height=200&access_token=${accessToken}`
  //
}))
于 2019-11-22T04:14:47.790 回答
0

2020年解决方案

从 passportjs passport-facebook 策略中获取用户 accessToken。
使用此令牌获取带有用户头像的 url 的 json:

https://graph.facebook.com/me/picture?access_token=${accessToken}&&redirect=false
于 2020-07-20T00:12:25.123 回答