2014-04-05 69 views
34

我正在使用Passport-Facebook身份驗證。Passport-Facebook身份驗證不提供所有Facebook帳戶的電子郵件

 
    passport.use(new FacebookStrategy({ 
      clientID: 'CLIENT_ID', 
      clientSecret: 'CLIENT_SECRET', 
      callbackURL: "http://www.example.com/auth/facebook/callback" 
     }, 
     function (accessToken, refreshToken, profile, done) {    
      process.nextTick(function() {     
       console.log(profile) 
      });    
     } 
    )); 

對於一些Facebook賬戶我沒有得到EMAIL_ID,我甚至使用範圍變量,如下面試過,但我仍無法獲得EMAIL_ID。

profileUrl: 「」 和ProfileFields:[ '', '']

+0

並非每個FB帳戶都設置了一個電子郵件地址...(人們也可以使用他們的手機號碼註冊FB) – CBroe

+0

但我沒有從包含電子郵件的帳戶收到電子郵件並註冊到我們需要的FB有電子郵件編號對嗎? – AMT

+0

我沒有看到你在任何地方要求'email'權限......你說你試圖使用範圍,但是在哪裏?不,如我已經說過的,人們不必給電子郵件地址註冊FB。 – CBroe

回答

25

當你進行身份驗證與此類似用途的東西。當您進行身份驗證時,您需要在範圍中使用添加「電子郵件」。

app.get('/auth/facebook', 
passport.authenticate('facebook', { scope: ['email']}), 
    function(req, res){ 
}); 

這對我有效。

下面是幾個幫助我的鏈接。

https://github.com/jaredhanson/passport-facebook/issues/11 https://github.com/jaredhanson/passport-facebook#how-do-i-ask-a-user-for-additional-permissions

+0

這也適用於我。 –

+0

非常感謝您節省了我的時間。 :) – Roni

+0

確保在設置策略時包含'profileFields'字段。只有在這裏添加'範圍'不會做到這一點(至少不適用於我)。有關更多信息,請參閱其他答案:http://stackoverflow.com/a/32370813/1814970。 – marcelocra

76

確保這兩個東西在你的代碼:

passport.use(new FacebookStrategy({ 
      clientID: 'CLIENT_ID', 
      clientSecret: 'CLIENT_SECRET', 
      callbackURL: "http://www.example.com/auth/facebook/callback" 
      passReqToCallback : true, 
      profileFields: ['id', 'emails', 'name'] //This 
     }, 

這:

app.get('/connect/facebook', passport.authorize('facebook', { scope : ['email'] })); 

這允許您訪問以下內容:

  • profile.id
  • profile.name.givenName
  • profile.name.familyName
  • profile.emails

最後一個是一個數組,所以使用profile.emails[0].value獲得的第一個電子郵件地址用戶。

由於shamim reza指出,您可能要檢查是否profile.emails !== undefined,因爲如果用戶至少有一個經過驗證的電子郵件地址,則該屬性才存在。

+1

meanjs鍋爐板缺少profileFields行 – zambono

+1

哇,你救了我的一天。大家都在談論範圍,但沒有人關於profileFields – llamerr

+1

給他「最佳答案」:) –

-1
passport.use(new FacebookStrategy({ 
     clientID: 'CLIENT_ID', 
     clientSecret: 'CLIENT_SECRET', 
     callbackURL: "http://www.example.com/auth/facebook/callback" 
    }, 
    function (accessToken, refreshToken, profile, done) {    
     process.nextTick(function() {     
      console.log(profile) 
     });    
    } 
)); 
2

我想在此處添加更多信息。

雖然在創建FacebookStrategy時添加profileFields: ['emails']passport.authorize('facebook', { scope : ['email'] })解決了大多數用戶的問題。

還有其他可能的原因,您認證後不會收到用戶的電子郵件。

  • 沒有對帳戶的電子郵件地址
  • 沒有證實,對帳戶的電子郵件地址
  • 的帳戶沒有經過驗證的電子郵件地址
  • 用戶進入其要求他們重新確認 一個安全檢查站電子郵件地址,他們還沒有這樣做
  • 用戶的電子郵件地址是不可達

您需要確保您的用戶沒有任何上述問題。可以找到更多信息https://developers.facebook.com/bugs/1802930019968631/

相關問題