2013-09-29 4 views
0

Это задавали много раз, но кажется, что для этого нет никакой известной работы, поэтому я отправляю этот вопрос в надежде, что у кого-то есть работа для него.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

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

ответ

6

Стратегия Facebook в паспортных ситуациях ожидает, что в настройках будет поле profileFields. Попробуйте передать «электронную почту» в параметрах.

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

В качестве альтернативы, вы можете переопределить profileUrl в options и отправить:

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); 
    }); 
    } 
)); 

`` `

+1

Не работает, у меня уже есть: 'profileFields: [" id "," name "," first_name "," last_name "," link "," username "," gender "," locale "," age_range " «displayName», «photos», «email»] ' – Poni

+0

. Переопределение опции profileUrl кажется серьезным взломом, что также подразумевает ошибку в самом паспорте. – Poni

+1

Я подтверждаю, что с помощью работы profileUrl он дает мне электронное письмо. Наверное, я открою ошибку в проекте Passport-Facebook. Спасибо Eugenio! – Poni

0

Вы должны обеспечить 'сферу' на местах в настройках объекта:

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

пытаются искать источники.

+0

не работал и не помог ни одному –