Подтвердить что ты не робот

Паспорт-facebook - не могу получить поля about_me и поля электронной почты

Я пытаюсь установить систему входа для своего приложения, используя паспорт-facebook. все идет хорошо, за исключением двух полей, которые возвращают undefined из запроса.

Я выложу весь свой код для процедуры входа в систему, так как я не видел много информации об этом здесь, хотя в этом есть много вопросов.

это конфигурация в app.js

var passport = require('passport');
var FacebookStrategy = require('passport-facebook').Strategy;

passport.serializeUser(function(user, done) {
  done(null, user.facebookId);
});
passport.deserializeUser(function(id, done) {
  routes.findUserById(id, function(err, user) {
    done(err, user);
  });
});

passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: FACEBOOK_CALLBACK_URL,
    profileFields: ['id', 'displayName', 'link', 'about_me', 'photos', 'email']
  },
  routes.handleLogin
));

с использованием инициализации паспорта и сеанса

app.use(passport.initialize());
app.use(passport.session());

обработка фактического запроса, заметьте, что я использую правильную область действия

app.get('/auth/facebook', passport.authenticate('facebook', { scope: ['user_about_me', 'email'] }));
app.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect: '/', failureRedirect: '/error' }));

и это моя функция создания пользователя в маршрутизаторе

exports.handleLogin = function(accessToken, refreshToken, profile, done) {
  db.userCatalog.findOne({ facebookId: profile.id }, function(err, existingUser) {
    if (err) {
      return done(err);
    }
    else {
      if(existingUser) {
        console.log('User: ' + existingUser.name + ' found and logged in!');
        done(null, existingUser);
        } 
      else {
        new db.userCatalog({
        name: profile.displayName,
        facebookId: profile.id,
        link: profile.link,
        picture: profile.photos[0].value,
        bio: profile.about_me,
        email: profile.email
        }).save(function (err, data) {
          if (err) {
            return done(err);
          }
          else {
            console.log('New user: ' + data + ' created and logged in!');
            done(null, data);
          }
        });
      }
    }
  });
};

и результат при создании нового пользователя после завершения процедуры входа в систему: введите описание изображения здесь

Я уверен, что это некоторая ошибка новобранец, но я просто не могу понять это сам...

4b9b3361

Ответ 1

Facebook возвращает некоторые атрибуты по умолчанию. Если вы хотите получить более подробную информацию о профиле клиента, вам придется объявить его под FacebookStrategy:

passport.use(new FacebookStrategy({

        clientID: "...",
        clientSecret: "...",
        callbackURL: "...",
        profileFields: ['id', '...', '...', 'photos', 'emails']

      }, ...

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

profile.photos[0].value,
profile.emails[0].value,
...

Для писем иногда полезно изменить:

passport.authenticate('facebook');

Для этого:

passport.authenticate('facebook', { scope: 'email'}));

Ответ 2

В профилеФильмы вы используете почтовые сообщения (plular) вместо электронной почты (единственное число):

profileFields: ['id', 'displayName', 'link', 'about_me', 'photos', 'emails']

Это указано в документации на facebook-паспорт README.md:

параметр profileFields, который задает список полей (называемых соглашением Portable Contacts)

И вы можете найти соглашения о переносных контактах для паспортных страниц здесь