Получение фотографии из Facebook с помощью паспорт-facebook

Я могу получить основную информацию пользователя через паспорт-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 говорится, что для извлечения фотографий нам необходимо передать профили, как показано ниже. Но при этом я могу видеть URL-адрес фотографии, но теряя другие данные, которые содержались в _json, например. profile._json.location.name. Как я могу восстановить фотографию с другой информацией пользователя?

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

Ответ 1

Да, изображение можно получить через график api, используя токен доступа, подобный этому. "Graph.facebook.com/"; + profile.username + "/picture" + "? width = 200 & height = 200" + "& access_token =" + accessToken; Нет необходимости использовать поля профиля.

Ответ 2

Если вам требуется более крупное изображение (по умолчанию в примере 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'

Это вернет изображение профиля 200px x 200px для этого пользователя.

Ответ 3

В дополнение к ответу на ваш вопрос - вам не обязательно это делать. Как вы упомянули, вы можете определить необходимые атрибуты для профиля Facebook:

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

Чем вы можете это сделать, просто просто захватите значение данного атрибута. Предположим, вы хотите создать атрибут, который будет удерживать это значение:

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

Это оказалось лучшим решением, так как некоторые пользователи или иногда значение имени пользователя может быть undefined.

Надеюсь, вы тоже найдете это полезным,

Спасибо.