2015-08-06 21 views
6

Sto usando la traduzione di Meanjs.org e la registrazione su Facebook mi riporta alla pagina di registrazione. Di seguito sono riportati i passaggi che ho preso finora.Login Facebook sta restituendo i campi "non definiti" nel profilo utente e non restituisce la posta elettronica. MEANJs + Passport-facebook

1) Impostazione del Facebook App URL sito

http://localhost:3000/

e il callback URI di OAuth

http://localhost:3000/auth/facebook/callback

2) Posizionamento del APP_ID e APP_Secret come Client_ID e Client_Secret

facebook: { 
    clientID: process.env.FACEBOOK_ID || '*****', 
    clientSecret: process.env.FACEBOOK_SECRET || '*****', 
    callbackURL: 'http://localhost:3000/auth/facebook/callback', 
    profileFields: ['id','emails', 'first_name', 'last_name', 'displayName', 'link', 'about_me', 'photos' ] 
}, 

3) codice è il seguente

--Routes

// Setting the facebook oauth routes 
app.route('/auth/facebook').get(passport.authenticate('facebook', { 
    scope: ['email'] 
})); 
app.route('/auth/facebook/callback').get(users.oauthCallback('facebook')); 

- La funzione oauthCallback,

exports.oauthCallback = function(strategy) { 
    return function(req, res, next) { 
     passport.authenticate(strategy, function(err, user, redirectURL) { 
      if (err || !user) { 
       console.log('1' + err); 
       //console.log(user); 
       return res.redirect('/#!/signin'); 
      } 
      req.login(user, function(err) { 
       if (err) { 
        console.log('2' + err); 
        return res.redirect('/#!/signin'); 
       } 

       return res.redirect(redirectURL || '/'); 
      }); 
     })(req, res, next); 
    }; 
}; 

- Passaporto-Facebook Strategia

module.exports = function() { 
// Use facebook strategy 
passport.use(new FacebookStrategy({ 
     clientID: config.facebook.clientID, 
     clientSecret: config.facebook.clientSecret, 
     callbackURL: config.facebook.callbackURL, 
     passReqToCallback: true 
    }, 
    function(req, accessToken, refreshToken, profile, done) { 

     console.log('facebook Strategy Started'); 
     // Set the provider data and include tokens 
     var providerData = profile._json; 
     providerData.accessToken = accessToken; 
     providerData.refreshToken = refreshToken; 

    // console.log(JSON.stringify(profile)); 
     console.log(profile); 

    // console.log(JSON.stringify(profile.name.givenName)); 

     // Create the user OAuth profile 
     var providerUserProfile = { 
      firstName: profile.name.givenName, 
      lastName: profile.name.familyName, 
      displayName: profile.displayName, 
      email: profile.emails[0].value, 
      username: profile.username, 
      provider: 'facebook', 
      providerIdentifierField: 'id', 
      providerData: providerData 
     }; 

     //console.log('provider' + providerUserProfile); 
     // Save the user OAuth profile 
     users.saveOAuthUserProfile(req, providerUserProfile, done); 
    } 
)); 

};

4) Debug

registrazione err in funzione oauthCallback restituisce il seguente,

1TypeError: Cannot read property '0' of undefined

Che Facebook ritorna come profilo Passport Facebook modulo è come segue,

{ id: 'Id_of_the_person', username: undefined, displayName: 'Full_name_of_person', name: { familyName: undefined, givenName: undefined, middleName: undefined }, gender: undefined, profileUrl: undefined, provider: 'facebook', _raw: '{"name":"Full_name_of_person","id":"Id_of_the_person"}', _json: { name: 'Id_of_the_person', id: 'Id_of_the_person', accessToken: 'access_token_value', refreshToken: undefined } }

Qualcuno può essere gentile a guidarmi su come ottenere il profilo utente corretto da Facebook, compresa l'email dell'utente?

Grazie mille.

+1

API v2.4 modifiche relative ai campi, vedere https://developers.facebook.com/docs/apps/changelog#v2_4_changes // L'effettiva richiesta dell'API effettuata deve essere modificata di conseguenza; se il tuo framework/SDK non ti espone tale richiesta, devi chiedere loro di adattare il loro codice. – CBroe

+0

Controllare la versione di passport-facebook nel file di installazione. Ho avuto una situazione simile e l'aggiornamento alla versione 2.0.0 ha risolto il problema. – dipole

risposta

0

In primo luogo, profileFields campo non obbedisce a Portable Contacts convention - e si può trovare la convenzione per passportjs here.

In secondo luogo, nel tuo esempio, dopo aver rimosso rimosso 'about_me', la registrazione di Facebook non restituisce alcun errore. Prima di rimuovere 'ABOUT_ME', ho avuto un errore diverso: provato accesso campo non esistente (ABOUT_ME) sul tipo di nodo (Utente)

Se l'errore persiste, consultare this serie di 5 tutorial che mi aiuta quando stavo facendo la iscriviti alla pagina per l'autenticazione con gli account dei social network.

0

ho i miei campi del profilo impostato al seguente

profileFields: ['email','id', 'first_name', 'gender', 'last_name', 'picture'] 

Anche se si imposta email esso potrebbe restituire messaggi di posta elettronica se l'utente dispone di più messaggi di posta elettronica. Quindi è necessario controllare se è stata restituita l'email profile.email o profile.emails [0] .value. Devi anche controllare se è indefinito, perché ci sono persone che si registrano con facebook che non verificano mai il proprio account e-mail e ci sono persone che si registrano con un numero di telefono, in entrambi i casi le loro e-mail saranno sempre indefinite.

si desidera verificare che tutti i campi richiesti abbiano valori.

var email = profile.email || profile.emails[0].value; 
      if (! email){ 
       console.log('this user has no email in his FB'); 
       var err = {message:'this user is missing an email'}; 
       return done(err); 
      } 

ora posso fare questo se hanno un e-mail

newUser.facebook.email = email; 

se non hanno una e-mail è possibile impostare una sessione per profilo e inviarli a una pagina che chiede loro di entrare un'email.

Suona come un dolore, ma non si può mai fidarsi di informazioni da una API di terze parti per avere valori.

La maggior parte degli esempi di passaporto che ho visto online sono errati. Tutti credono che sia presente un'email.

Problemi correlati