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

Аутентификация Passport-Facebook не предоставляет адрес электронной почты для всех учетных записей Facebook

Я использую Passport-Facebook аутентификацию.

  passport.use(new FacebookStrategy({
            clientID: 'CLIENT_ID',
            clientSecret: 'CLIENT_SECRET',
            callbackURL: "http://www.example.com/auth/facebook/callback"
        },
        function (accessToken, refreshToken, profile, done) {            
            process.nextTick(function () {                
               console.log(profile)
            });               
        }
    ));

Для некоторых учетных записей Facebook я не получаю email_id, и даже пытался использовать переменную области видимости, например, ниже, но все же я не могу получить email_id.

profileUrl: "" и ProfileFields: ['', '']

4b9b3361

Ответ 1

Убедитесь, что эти две вещи есть в вашем коде:

  passport.use(new FacebookStrategy({
            clientID: 'CLIENT_ID',
            clientSecret: 'CLIENT_SECRET',
            callbackURL: "http://www.example.com/auth/facebook/callback"
            passReqToCallback : true,
            profileFields: ['id', 'emails', 'name'] //This
        },

и это:

app.get('/connect/facebook', passport.authorize('facebook', { scope : ['email'] }));

Это дает вам доступ к следующему:

  • profile.id
  • profile.name.givenName
  • profile.name.familyName
  • profile.emails

Последний является массивом, поэтому используйте profile.emails[0].value чтобы получить первый адрес электронной почты пользователя.

Как shamim reza, вы можете проверить, если profile.emails !== undefined потому что свойство существует, только если у пользователя есть хотя бы один подтвержденный адрес электронной почты.

Как указал Weft, вам, возможно, придется использовать email а не emails.

Ответ 2

Когда вы используете аутентификацию, используйте что-то похожее на это. Вы должны использовать "email" в области при аутентификации.

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

Это сработало для меня.

Вот несколько ссылок, которые помогли мне.

https://github.com/jaredhanson/passport-facebook/issues/11 https://github.com/jaredhanson/passport-facebook#how-do-i-ask-a-user-for-additional-permissions

Ответ 3

Я хотел бы добавить больше информации здесь.

При добавлении profileFields: ['emails'] при создании FacebookStrategy и passport.authorize('facebook', { scope: ['email'] }) решает проблему для большинства пользователей.

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

  • Нет адреса электронной почты в учетной записи
  • Нет подтвержденного адреса электронной почты на счету
  • Нет подтвержденного адреса электронной почты в аккаунте
  • Пользователь ввел контрольно-пропускной пункт безопасности, который потребовал от него подтвердить свой адрес электронной почты, и они еще не сделали этого
  • Адрес электронной почты пользователя недоступен

Вы должны убедиться, что у вашего пользователя нет проблем, перечисленных выше. Более подробную информацию можно найти https://developers.facebook.com/bugs/1802930019968631/

Ответ 4

Если паспорт не возвращает поля profile.emails, profile.name.givenName, profile.name.familyName или если они отсутствуют, вы можете попытаться проанализировать https://graph.facebook.com/v3.2/ URL, хотя вам все еще нужен токен. Вы получаете доступ к URL-адресу с помощью действительного токена, например:

https://graph.facebook.com/v3.2/me?fields=id,name,email,first_name,last_name&access_token=

Он выводит ответ JSON, например:

{
   "id": "5623154876271033",
   "name": "Kurt Van den Branden",
   "email": "kurt.vdb\u0040example.com",
   "first_name": "Kurt",
   "last_name": "Van den Branden"
}

Установите модуль запроса ($ npm install request --save), чтобы иметь возможность проанализировать URL-адрес JSON и в файле passport.js:

const request = require("request");

passport.use(new FacebookStrategy({
        clientID        : 'CLIENT_ID',
        clientSecret    : 'CLIENT_SECRET',
        callbackURL     : "https://example.com/auth/facebook/callback"
    },
    function(req, token, profile, done) {

        let url = "https://graph.facebook.com/v3.2/me?" +
                  "fields=id,name,email,first_name,last_name&access_token=" + token;

        request({
            url: url,
            json: true
        }, function (err, response, body) {
              let email = body.email;  // body.email contains your email
              console.log(body); 
        });
    }
));

Вы можете добавить много других параметров в URL, хотя некоторые из них требуют разрешения пользователя для возврата значений. Вы можете играть с ним на: https://developers.facebook.com/tools/explorer/

Ответ 6

Убедитесь, что вы предоставляете параметр scope в первом вызове .authenticate(), а не в обратном вызове.

Как это:

router.get("/auth/facebook", passport.authenticate("facebook", {
    scope: [ "email" ], // scope goes here, not below
}));

router.get("/auth/facebook/callback",
    passport.authenticate("facebook", {
        successRedirect: "/",
        failureRedirect: "/login",
    }),
);

Ответ 7

passport.use(new FacebookStrategy({
        clientID: 'CLIENT_ID',
        clientSecret: 'CLIENT_SECRET',
        callbackURL: "http://www.example.com/auth/facebook/callback"
    },
    function (accessToken, refreshToken, profile, done) {            
        process.nextTick(function () {                
           console.log(profile)
        });               
    }
));