Meteor.loginWithFacebook не сохраняет адрес электронной почты

я использую

На сервере:

ServiceConfiguration.configurations.remove({
    service: 'facebook'
});

ServiceConfiguration.configurations.upsert(
    { service: 'facebook' },
    { $set: {
        appId: 'xxxxxxxxxxxxxxxx',
        secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
      }
    }
);

На клиенте:

Meteor.loginWithFacebook({requestPermissions: ['email']}, function(error){
  if (error) {
    throwError('Could not log in');
  } else {
    // success
  }
});

Эта конфигурация предлагает пользователю пройти проверку Facebook с доступом к электронной почте и не возвращает никаких ошибок. Новый пользователь сохраняется с правильным именем и идентификатором. Но это электронное письмо не хранится в объекте пользователя.

Это то, что я получаю, когда я получаю пользователя из оболочки.

{ _id: 'xxxxxxxxxxxxxxxxx',
  createdAt: Mon Jul 13 2015 13:36:21 GMT+0200 (CEST),
  services: 
   { facebook: 
      { accessToken: 'xxxxxxxxxxxxxxxxxxxxx...',
        expiresAt: 1441971380621,
        id: 'xxxxxxxxxxxxxxxxx',
        name: 'xxxx xxxxxx' },
     resume: { loginTokens: [Object] } },
  profile: { name: 'xxxx xxxxxx' } }

Почему адрес электронной почты из Facebook не сохраняется?


person KnutSv    schedule 13.07.2015    source источник
comment
Добавлена ​​проблема с Meteor github.com/meteor/meteor/issues/4743 и код для воспроизводит ошибку: github.com/KnutSv/Meteor-facebook-login-email- ошибка   -  person KnutSv    schedule 14.07.2015


Ответы (2)


Хотя я сообщил о проблеме Meteor, я нашел быстрое решение на данный момент. .

На сервере запустите это:

Accounts.onCreateUser(function(options, user) {
  if (user.hasOwnProperty('services') && user.services.hasOwnProperty('facebook')  ) {
    var fb = user.services.facebook;
    var result = Meteor.http.get('https://graph.facebook.com/v2.4/' + fb.id + '?access_token=' + fb.accessToken + '&fields=name,email');

    if (!result.error) {
      _.extend(user, {
        "emails": [{"address": result.data.email, "verified": false}],
        "profile": {"name": result.data.name}
      });
    }
  }

  return user;
});

[РЕДАКТИРОВАТЬ]

Предыдущий код работает, но поскольку он вызывает проблемы с другими методами входа в систему, я выбрал другой подход:

В клиенте я вызываю функцию на сервере, когда пользователь аутентифицируется в Facebook:

Meteor.loginWithFacebook({requestPermissions: ['email']}, function(error){
  if (error) {
    //error
  } else {
    Meteor.call('fbAddEmail');
  }
});

А потом на сервере:

Meteor.startup(function () {
  Meteor.methods({
    fbAddEmail: function() {
      var user = Meteor.user();
      if (user.hasOwnProperty('services') && user.services.hasOwnProperty('facebook')  ) {
        var fb = user.services.facebook;
        var result = Meteor.http.get('https://graph.facebook.com/v2.4/' + fb.id + '?access_token=' + fb.accessToken + '&fields=name,email');

        if (!result.error) {
          Meteor.users.update({_id: user._id}, {
            $addToSet: { "emails": {
              'address': result.data.email,
              'verified': false
            }}
          });
        }
      }
    }
  });
});
person KnutSv    schedule 14.07.2015

Facebook API может не вернуть адрес электронной почты для некоторых пользователей, даже если вы запросили разрешение «электронная почта». В официальной документации API указано следующее:

Поле [электронная почта] не будет возвращено, если действующий адрес электронной почты недоступен.

Одной из причин может быть неподтвержденный адрес электронной почты, а другой — пользователь, который зарегистрировался только с номером мобильного телефона.

person Guillaume    schedule 13.07.2015
comment
Да, я тоже сталкивался с этим. Но это моя личная учетная запись Facebook, и я точно знаю, что у нее есть действующий и проверенный адрес электронной почты. Я даже вижу правильный адрес электронной почты, когда хочу просмотреть дополнительную информацию о том, чем я делюсь, во всплывающем окне, которое вызывается Meteor. - person KnutSv; 13.07.2015
comment
Действительно странно, я получаю адреса электронной почты для нескольких учетных записей в приложении, над которым сейчас работаю. Единственная разница в том, что я запросил два разрешения ['public_profile', 'email'], но сомневаюсь, что это как-то связано с вашей проблемой - person Guillaume; 13.07.2015
comment
Я пытался добавить public_profile в массив, но это не дало результата. Это работает для вас, когда вы запускаете его на локальном хосте? Также может быть какое-то кеширование на стороне Facebook, я сначала настроил его без разрешения электронной почты, а затем добавил его позже. - person KnutSv; 13.07.2015
comment
да, это работало во время разработки на локальном хосте, а теперь работает на рабочем сервере с теми же учетными записями Facebook (старые учетные записи с электронной почтой) - person Guillaume; 13.07.2015
comment
Похоже, причина в изменении API Facebook с версии 2.4, теперь вам нужно запрашивать электронную почту в вызове графа конкретно: developers.facebook.com/blog/post/2015/07/08/graph-api-v2.4 - person KnutSv; 14.07.2015