2014-09-14 6 views
11

Ich habe das Facebook-LogIn bereits in meiner Website mit Express js und Pass-Facebook implementiert. Es funktioniert gut (ich bekomme Feldprofil), aber das Problem ist, dass ich die E-Mail nicht bekomme. Ich erhalte eine Fehlermeldung:Passport-facebook bekommt keine E-Mail

email : profile.emails[0].value, 

Typeerror: kann nicht lesen Eigenschaft ‚0‘ undefinierten

Mein Code:

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

Es wäre toll, wenn mir jemand mit der Lösung helfen könnte meinen Problem :)

+0

haben Sie versucht, das Profil Objekt anmelden, um zu sehen, was es enthält? – soulcheck

+0

ich habe es jetzt versucht. Profil enthält keine E-Mails ... – jcabello

+0

Was passiert, wenn Sie den ProfilFields-Parameter nicht verwenden? – soulcheck

Antwort

11

Ich hatte das gleiche Problem. Wir hatten 10 Testbenutzer, alle 10 hatten E-Mail-Adressen mit ihrem Facebook-Konto verknüpft. Aber für einen der 10 Tester hat Facebook die JSON-Eigenschaft "email" in der Profilantwort nicht zurückgegeben. Ich habe keine Ahnung warum, denn es sah genauso aus wie andere Facebook-Profile, die gut funktionierten.

Das Update war diese Zeile zu ändern:

passport.authenticate('facebook') 

Um dies:

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

Ich kann immer noch nicht erklären, warum es für 9/10 gearbeitet, aber nicht für einen. So oder so, es ist jetzt behoben :-)

+1

Das gleiche wie folgt: http://stackoverflow.com/questions/22880876/passport-facebook-authentication-is-not-providing-email-for-all-fbaccounts –

+0

Hatte das gleiche Problem das half: http: // stackoverflow. com/questions/20291357/pass-facebook-cant-about-me-and-email-profile-fields – kaxi1993

+0

Bitten Sie einen Tester, diese App von seinem Facebook-Account zu entfernen. und versuche es dann erneut. es wird funktionieren –

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

eine kurze Erklärung der Antwort wäre nützlich für die OP –

1

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

auch ein neues Feld profileFields: [ 'email' , 'name' ] im facebookStrategy hinzufügen

+0

bitte schreiben Sie mehr saubere Antwort, die von der Gemeinschaft verstanden wird. –

+0

Danke für Ihren freundlichen Vorschlag. Da ich neu im Stackoverflow bin, kenne ich die Antwort nicht. Nächstes Mal werde ich mein Bestes geben. – Ajay