2015-07-13 2 views
1

Я использую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?

+0

Добавлено выпуска Метеор https://github.com/meteor/meteor/issues/4743 и код для воспроизведения ошибки: https://github.com/KnutSv/Meteor-facebook-login-email-bug – KnutSv

ответ

0

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

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

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

+0

Да, я тоже сталкивался с этим. Но это моя личная учетная запись Facebook, которую я знаю для факта, имеет действительный и проверенный адрес электронной почты. Я даже вижу правильный адрес электронной почты, когда я предпочитаю видеть больше информации о том, что я использую во всплывающем окне, которое запускается из Meteor. – KnutSv

+0

Действительно странно, я получаю адреса электронной почты для нескольких учетных записей в приложении, в котором я сейчас работаю.Единственное различие заключается в том, что я попросил два разрешения '['public_profile', 'email']', но я сомневаюсь, что это имеет какое-то отношение к вашей проблеме. – Guillaume

+0

Я попытался добавить 'public_profile' в массив, но он нет эффекта. Он работает для вас, когда вы запускаете его на локальном хосте? Также может быть какое-то кэширование на стороне Facebook, я сначала настроил его без разрешения электронной почты, а затем добавил его позже. – KnutSv

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

[EDIT]

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

В клиент, вызывающий функцию на сервере, когда пользователь аутентифицируется с помощью 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 
      }} 
      }); 
     } 
     } 
    } 
    }); 
}); 
Смежные вопросы