2015-08-06 4 views
6

Ich benutze Meanjs.org Boilerplate und Facebook Signup bringt mich auf die Anmeldeseite. Im Folgenden sind die Schritte, die ich bisher unternommen habe.Facebook Login gibt 'Undefined' Felder im Benutzerprofil zurück und gibt keine E-Mail zurück. MEANJs + Pass-facebook

1) die Facebook-App Site URL einrichten

http://localhost:3000/

und den Rückruf URI von OAuth

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

2) Platzierung der APP_ID und APP_Secret in als Client_ID und 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)-Code ist wie folgt

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

- Die oauthCallback Funktion,

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

- Passport-Facebook-Strategie

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) Debuggen

Logging err unter oauthCallback Funktion Folgende liefert,

1TypeError: Cannot read property '0' of undefined

Was Book als Profil zurück in Passbook-Modul ist wie folgt,

{ 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 } }

Kann jemand freundlich sein, mich zu führen, um das korrekte Benutzerprofil von Facebook einschließlich Benutzeremail zu erhalten?

Vielen Dank.

+1

API v2.4 Änderungen in Bezug auf Felder, siehe https://developers.facebook.com/docs/apps/changelog#v2_4_changes // Die tatsächliche API-Anfrage muss entsprechend geändert werden; Wenn Ihr Framework/SDK diese Anfrage nicht für Sie verfügbar macht, müssen Sie sie bitten, ihren Code anzupassen. – CBroe

+0

Überprüfen Sie die Version von Reisepass-Facebook im Textbaustein. Ich hatte eine ähnliche Situation und ein Upgrade auf Version 2.0.0 löste das Problem. – dipole

Antwort

0

Zuerst Profil Feld nicht gehorcht zu Portable Contacts convention - und Sie können die Konvention für passportjs here finden.

Zweitens, in Ihrem Beispiel, nach dem Entfernen entfernt 'about_me', die Facebook-Anmeldung gibt keinen Fehler zurück. Vor dem Entfernen ‚ABOUT_ME‘, hatte ich einen anderen Fehler: nonexisting Feld Versuchte Zugriff (ABOUT_ME) auf Knotentyp (Benutzer)

Wenn der Fehler weiterhin bestehen, siehe this Serie von 5 Tutorials, die mir hilft, wenn ich tat, die Anmeldeseite zur Authentifizierung bei Konten sozialer Netzwerke.

0

Ich habe meine Profilfelder auf der folgenden

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

Auch wenn Sie es einrichten E-Mail möglicherweise E-Mails zurück, wenn der Benutzer mehrere E-Mails hat. Sie müssen also überprüfen, ob die E-Mail-Adresse profile.email oder profile.emails [0] .value zurückgegeben wurde. Sie müssen auch überprüfen, ob es nicht definiert ist, da sich Personen bei Facebook registrieren, die ihr E-Mail-Konto nicht bestätigen, und es gibt Leute, die sich mit einer Telefonnummer anmelden, in beiden Fällen sind ihre E-Mails immer undefiniert.

Sie möchten überprüfen, ob die erforderlichen Felder Werte enthalten.

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

jetzt kann ich dies tun, wenn sie eine E-Mail haben

newUser.facebook.email = email; 

, wenn sie nicht über eine E-Mail Sie eine Sitzung für Profil einstellen und sie auf eine Seite senden, der sie fragt eingeben eine E-Mail.

Es klingt wie ein Schmerz, aber Sie können niemals Informationen von einer Drittpartei API vertrauen, um Werte zu haben.

Die meisten Passbeispiele, die ich online gesehen habe, sind falsch. Sie alle gehen davon aus, dass eine E-Mail vorhanden ist.

Verwandte Themen