2015-07-13 40 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存儲。但是這個電子郵件不存儲在用戶對象中。

這就是我從shell獲取用戶時所得到的結果。

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

[編輯]

前面的代碼工作,但由於它會導致問題與其他方式登錄我用另一種方法去:

在客戶端在用戶使用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 
      }} 
      }); 
     } 
     } 
    } 
    }); 
}); 
相關問題