Passport-Facebook не предоставляет электронную почту, даже если она находится в области

В моем приложении я регистрирую facebook-стратегию следующим образом: Но возвращенный профиль не содержит поля электронной почты....

passport.use(new FacebookStrategy({
        clientID: config.facebook.clientID,
        clientSecret: config.facebook.clientSecret,
        callbackURL: config.facebook.callbackURL,
        passReqToCallback: true
    },
    function(req, accessToken, refreshToken, profile, done) {
        // No email in the following colsole.log
        console.log(JSON.stringify(profile));
    }));

Получаем следующее:

app.get('/oauth/facebook', passport.authenticate('facebook', {
    failureRedirect: '/login',
    scope:['email']
}));

(Итак, я использую область действия, как сказано здесь: Паспорт-facebook не получает электронную почту)

На странице FB-Login iam даже попросил отправить электронное письмо, и я предоставляю его: enter image description here

Любая помощь очень приветствуется!

Ответы

Ответ 1

Из графа Facebook APIv2.4 нам нужно явно указать поля для получения.

Представляем Graph API v2.4

Итак, мы можем написать как:

  passport.use(new FacebookStrategy({
      clientID: config.facebook.clientID,
      clientSecret: config.facebook.clientSecret,
      callbackURL: config.facebook.callbackURL,
      profileFields: ['id', 'email', 'gender', 'link', 'locale', 'name', 'timezone', 'updated_time', 'verified'],
    },

Ответ 2

У вас есть часть обратного вызова кода, правильно?:

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

И да, действительно, это должно быть сделано с помощью scope:['email'] в соответствии с инструкциями из вашей ссылки и этой здесь также.

Ответ 3

Вам необходимо указать область действия: "электронная почта". Смотрите приведенный ниже код.

Маршрут аутентификации Facebook:

// auth facebook
router.get("/auth/facebook", passport.authenticate("facebook", {
  scope: "email"
}));

и при настройке FacebookStrategy необходимо также указать поля profileFields.

passport.use(new FacebookStrategy({
  callbackURL: "http://localhost:5000/auth/facebook/redirect",
  clientID: keys.facebook.clientID,
  clientSecret: keys.facebook.clientSecret,
  profileFields: ['id', 'displayName', 'photos', 'email', 'gender', 'name']
}, (accessToken, refreshToken, profile, done) => {
   // logic 
}))