2014-09-14 2 views
11

Я уже реализовал Facebook-Login на своем сайте с помощью экспресс-писем и паспортов-Facebook. Он работает хорошо (я получаю профиль поля), но проблема в том, что я не получаю электронную почту. Я получаю сообщение об ошибке:Паспорт-facebook не получает по электронной почте

email : profile.emails[0].value, 

TypeError: Не удается прочитать свойство «0» неопределенных

Мой код:

passport.use('facebook',new FacebookStrategy({ 
     clientID   : config.facebook.id, 
     clientSecret : config.facebook.secret, 
     callbackURL : '/auth/facebook/callback', 
     profileFields : ['id', 'displayName', 'emails','photos'] 
    }, function(accessToken, refreshToken, profile, done) { 

     User.findOne({provider_id: profile.id}, function(err, user) { 
      if(err) throw(err); 
      if(!err && user!= null) return done(null, user); 

      var user = new User({ 
       provider_id : profile.id, 
       name     : profile.displayName, 
       email    : profile.emails[0].value, 
       photo    : profile.photos[0].value, 
      }); 
      user.save(function(err) { 
       if(err) throw err; 
       return done(null, user); 
      }); 
     }); 
    })); 

Было бы здорово, если бы кто-то может помочь мне с решением моей проблема :)

+0

вы пробовали протоколирование объект профиля, чтобы увидеть, что он содержит? – soulcheck

+0

Я попробовал это сейчас. Профиль не содержит сообщений электронной почты ... – jcabello

+0

Что произойдет, если вы не используете параметр profileFields? – soulcheck

ответ

11

У меня была та же проблема. У нас было 10 тестовых пользователей, у всех 10 были адреса электронной почты, связанные с их учетной записью Facebook. Но для одного из 10 тестеров Facebook не вернул свойство «email» JSON в ответе профиля. Я понятия не имею, почему, поскольку он выглядел идентично другим профилям Facebook, которые отлично работали.

Исправление было изменить эту строку:

passport.authenticate('facebook') 

Для этого:

passport.authenticate('facebook', { scope: [ 'email' ] }) 

Я до сих пор не может объяснить, почему он работал на 9/10, но не для одного. В любом случае, это теперь установлено :-)

+1

То же, что и: http://stackoverflow.com/questions/22880876/passport-facebook-authentication-is-not-providing-email-for-all-fbaccounts –

+0

Если бы такая же проблема помогла: http: // stackoverflow. com/questions/20291357/passport-facebook-cant-get-about-me-and-email-profile-fields – kaxi1993

+0

Попросите одного тестера удалить это приложение из своей учетной записи Facebook. а затем повторите попытку. он будет работать –

0
passport.use(new FacebookStrategy({ 
    clientID: config.facebook.clientID, 
    clientSecret: config.facebook.clientSecret, 
    callbackURL: config.facebook.callbackURL, 
    passReqToCallback:true 
    }, 
+2

краткое объяснение ответа было бы полезно для OP –

1

Попробуйте passport.authenticate('facebook', { scope: [ 'email' ] })

также добавить новое поле profileFields: [ 'email' , 'name' ] в facebookStrategy

+0

, пожалуйста, напишите более аккуратный ответ, понятный сообществу. –

+0

Спасибо за ваше предложение. Поскольку я новичок в stackoverflow, я не знаком с тем, как отвечать. В следующий раз я постараюсь изо всех сил. – Ajay

Смежные вопросы