Стратегия Passport Facebook возвращает неопределенные значения

Я использую плагин passport-facebook в приложении NextJS, и мой тестовый скрипт определяет стратегию, как показано ниже:

// Configure Passport
// ---------------------------------------------------------------
passport.use(new LocalStrategy(User.authenticate()));
passport.use(new FacebookStrategy({
  clientID: process.env.FACEBOOK_APP_ID,
  clientSecret: process.env.FACEBOOK_APP_SECRET,
  callbackURL: process.env.FACEBOOK_APP_CALLBACK,
},
  function (accessToken, refreshToken, profile, done) {
    console.log(profile);
  }
));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
// ---------------------------------------------------------------

Мои маршруты аутентификации:

// Facebook
router.get('/auth/facebook', passport.authenticate('facebook'));
router.get('/facebook/callback',
  passport.authenticate('facebook', {
    successRedirect: '/success',
    failureRedirect: '/failure',
  }),
);

Все, что я сейчас пытаюсь сделать, это отобразить все значения, возвращенные Facebook после успешной аутентификации. Аутентификация работает, как и ожидалось, но Facebook, похоже, возвращается undefined для большинства ключей в profile объект:

{ id: '1234567812345677',
  username: undefined,
  displayName: 'John Doe',
  name:
   { familyName: undefined,
     givenName: undefined,
     middleName: undefined },
  gender: undefined,
  profileUrl: undefined,
  provider: 'facebook',
  _raw: '{"name":"John Doe","id":"1234567812345677"}',
  _json: { name: 'John Doe', id: '1234567812345677' } }

Все, что я получаю, это displayName а также id; все остальное undefined, Что не так? Очень похожий вопрос был задан здесь ранее, но ни один из предложенных ответов (не принятых ответов) не решает проблему.

1 ответ

У меня нет опыта в этой области, но, глядя на readme в Facebook-паспорте, кажется, что вам нужно использовать profileFields в вашем FacebookStrategy,:

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

new FacebookStrategy({
  clientID: FACEBOOK_APP_ID,
  clientSecret: FACEBOOK_APP_SECRET,
  callbackURL: "http://localhost:3000/auth/facebook/callback",
  profileFields: ['id', 'displayName', 'photos', 'email']
}), ...)

Обратитесь к разделу User Справочника по API Graph для получения полного набора доступных полей.

Другие вопросы по тегам