Паспорт-facebook не получает электронную почту

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

email   : profile.emails[0].value,

TypeError: невозможно прочитать свойство '0' из undefined

Мой код:

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

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

Ответы

Ответ 1

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

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

passport.authenticate('facebook')

Для этого:

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

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

Ответ 2

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

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

Ответ 3

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