2014-09-14 15 views
11

Ho già implementato Facebook-LogIn nel mio sito Web con express js e passport-Facebook. Funziona bene (ottengo il profilo del campo), ma il problema è che non ricevo l'e-mail. Ottengo un errore:Passport-facebook non riceve e-mail

email : profile.emails[0].value, 

TypeError: Impossibile leggere la proprietà '0' di indefinito

Il mio codice:

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

Sarebbe bello se qualcuno mi potrebbe aiutare con la soluzione al mio problema :)

+0

avete provato la registrazione l'oggetto profilo per vedere che cosa contiene? – soulcheck

+0

ho provato ora. Il profilo non contiene email ... – jcabello

+0

cosa succede se non usi il parametro profileFields? – soulcheck

risposta

11

Ho avuto lo stesso problema. Abbiamo avuto 10 utenti di test, tutti e 10 avevano indirizzi email associati al loro account Facebook. Ma per uno dei 10 tester, Facebook non ha restituito la proprietà JSON 'email' nella risposta del profilo. Non ho idea del perché, dal momento che sembrava identico ad altri profili di Facebook, funzionava bene.

La correzione era quello di cambiare questa linea:

passport.authenticate('facebook') 

A tal:

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

non riesco ancora a spiegare perché ha funzionato per 9/10, ma non per uno. In entrambi i casi, è fissato ora :-)

+1

Lo stesso di questo: http://stackoverflow.com/questions/22880876/passport-facebook-authentication-is-not-providing-email-for-all-fbaccounts –

+0

Aveva lo stesso problema questo aiutato: http: // StackOverflow. it/questions/20291357/passport-facebook-cant-get-about-me-e-mail-profile-fields – kaxi1993

+0

Chiedi a un tester di rimuovere questa app dal suo account Facebook. e poi riprova. Funzionerà –

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

una breve spiegazione della risposta sarebbe utile all'OP –

1

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

aggiungere anche un nuovo campo profileFields: [ 'email' , 'name' ] nel facebookStrategy

+0

per favore scrivi una risposta più pulita che è capita dalla comunità. –

+0

Grazie per il gentile suggerimento. Dato che sono un nuovo stackoverflow, non mi è familiare il modo di rispondere. La prossima volta farò del mio meglio. – Ajay