Facebook OAuth2 не предоставляет адрес электронной почты пользователя

Об этом спрашивали много раз, но похоже, что для этого нет известного обходного пути, поэтому я публикую этот вопрос в надежде, что у кого-то есть обходной путь.

Я использую NodeJS, PassportJS-Facebook.

app.get("/auth/facebook",
            passport.authenticate("facebook", {
                scope : [ "email" ]
            }),
            function (req, res) {
            });

Сначала я подумал, что это проблема PassportJS, но я, конечно, исключил эту опцию.
В учетной записи пользователя Facebook, которую я использую, четко указано:

This app needs: 
Your basic info
Your email address ([email protected])

Некоторые ссылки на эту известную проблему (пока не решенную!): https://developers.facebook.com/bugs/298946933534016 https://developers.facebook.com/bugs/429653750464521 https://developers.facebook.com/bugs/482815835078469

Итак, вы используете сервис Facebook OAuth? Если да, то получаете ли вы электронную почту пользователя? Как? "Прямой" путь? Обходной путь?


person Poni    schedule 29.09.2013    source источник


Ответы (2)


Стратегия Facebook в паспорте предполагает наличие поля profileFields в параметрах. Попробуйте передать "email" в настройках.

strategyOptions.profileFields = ['emails', 'first_name', 'last_name'];

Кроме того, вы можете переопределить profileUrl в options и отправить:

strategyOptions.profileURL = 'https://graph.facebook.com/me?fields=location,first_name,last_name,middle_name,name,link,username,work,education,gender,timezone,locale,verified,picture,about,address,age_range,bio,birthday,cover,currency,devices,email,favorite_athletes,id,hometown,favorite_teams,inspirational_people,install_type,installed,interested_in,languages,meeting_for,name_format,political,quotes,relationship_status,religion,significant_other,sports,updated_time,website';

Facebook будет игнорировать поля, на которые у вас нет разрешения (например, электронная почта).

Это должно быть здесь:

passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: "http://localhost:3000/auth/facebook/callback",
    profileUrl: "  ..... ",
    //or
    profileFields: [ ... ];
  },
  function(accessToken, refreshToken, profile, done) {
    // asynchronous verification, for effect...
    process.nextTick(function () {

      // To keep the example simple, the user's Facebook profile is returned to
      // represent the logged-in user.  In a typical application, you would want
      // to associate the Facebook account with a user record in your database,
      // and return that user instead.
      return done(null, profile);
    });
  }
));

```

person Eugenio Pace    schedule 29.09.2013
comment
Не работает, у меня уже есть: profileFields : ["id", "name", "first_name", "last_name", "link", "username", "gender", "locale", "age_range", "displayName", "photos", "email"] - person Poni; 29.09.2013
comment
Переопределение параметра profileUrl кажется серьезным взломом, который также подразумевает ошибку в самом Passport. - person Poni; 29.09.2013
comment
Я подтверждаю, что использование profileUrl работает, оно дает мне адрес электронной почты. Думаю, я открою ошибку в проекте Passport-Facebook.. Спасибо, Эухенио! - person Poni; 29.09.2013
comment
Просто продолжение - это должны быть электронные письма, а не электронная почта. - person Poni; 29.09.2013
comment
Рад, что это сработало! Использование «электронной почты» в profileFields тоже должно работать (электронная почта, а не электронная почта, вы правы). re: переопределение profileUrl, не уверен, что это серьезный взлом или нет. Мне это тоже не нравится, но это вариант расширения, предлагаемый библиотекой. Удачи! - person Eugenio Pace; 29.09.2013
comment
я хотел бы просто выразить свою огромную благодарность за этот элегантный ответ ... вы действительно спасли мой проект, братан ... в то время как у меня было всего несколько часов, чтобы завершить вход в Facebook - person Adeel Ahmad; 02.02.2016

Вы должны указать область действия в объекте настроек:

new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: "http://localhost:3000/auth/facebook/callback",
    profileUrl: "  ..... ",
    scope: "email",
    //or
    profileFields: [ ... ];
  }

попробуй посмотреть исходники.

person Evgeniy Kubyshin    schedule 18.07.2015