2014-09-14 11 views
11

Mam już zaimplementowaną Facebook-LogIn na mojej stronie z ekspresowym js i paszportem-Facebookiem. Działa dobrze (otrzymuję profil pola), ale problem polega na tym, że nie otrzymuję wiadomości e-mail. I pojawia się błąd:Paszport-facebook nie otrzymuje wiadomości e-mail

email : profile.emails[0].value, 

TypeError: nie można odczytać właściwość '0' undefined

Mój kod:

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

Byłoby wspaniale, gdyby ktoś mógłby mi pomóc z rozwiązaniem do mojego problem :)

+0

próbowałeś logowania obiektu profilu, aby zobaczyć, co zawiera? – soulcheck

+0

Próbowałem już teraz. Profil nie zawiera e-maili ... – jcabello

+0

co się stanie, jeśli nie użyjesz parametru profileFields? – soulcheck

Odpowiedz

11

Miałem ten sam problem. Mieliśmy 10 użytkowników testowych, wszyscy 10 mieli adresy e-mail powiązane z ich kontem na Facebooku. Ale dla jednego z 10 testerów Facebook nie zwrócił właściwości "JSON" e-mail w odpowiedzi profilu. Nie mam pojęcia dlaczego, ponieważ wyglądało to tak samo jak inne profile na Facebooku, które działały bez zarzutu.

Rozwiązaniem było zmienić tę linię:

passport.authenticate('facebook') 

do tego:

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

wciąż nie potrafią wyjaśnić, dlaczego to działało na 9/10, ale nie dla nich. Tak czy inaczej, to teraz naprawić :-)

+1

To samo: http://stackoverflow.com/questions/22880876/passport-facebook-authentication-is-not-providing-email-for-all-fbaccounts –

+0

Miał ten sam problem, który pomógł: http: // stackoverflow. com/questions/20291357/passport-facebook-cant-get-about-me-and-mail-profile-fields – kaxi1993

+0

Poproś jednego z testerów, aby usunął tę aplikację ze swojego konta na Facebooku. a następnie spróbuj ponownie. zadziała –

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

krótkie wyjaśnienie odpowiedzi byłoby przydatne dla OP –

1

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

dodać także nowe pole profileFields: [ 'email' , 'name' ] w facebookStrategy

+0

proszę napisać bardziej zgrabną odpowiedź, która jest rozumiana przez społeczność. –

+0

Dzięki za życzliwą sugestię. Ponieważ jestem nowy w stackoverflow, nie znam sposobu odpowiedzi. Następnym razem postaram się jak najlepiej. – Ajay