2015-08-06 10 views
6

Używam standardowej płyty Meanjs.org, a Facebook Signup zwraca mnie na stronę rejestracji. Poniżej przedstawiono kroki, które podjąłem do tej pory.Facebook Login zwraca "Nieokreślone" Pola w profilu użytkownika i nie zwraca wiadomości e-mail. MEANJs + Passport-facebook

1) Konfigurowanie Facebook App Site URL

http://localhost:3000/

i oddzwanianie URI OAuth

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

2) Umieszczenie APP_ID i APP_Secret w jak Klient_ID i Klient_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) Kod jest następujący

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

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

- Passport 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) Debugowanie

Logging err pod funkcją oauthCallback zwraca następujący,

1TypeError: Cannot read property '0' of undefined

Co Facebook powraca jako profilu w Passport Facebook moduł jest następująca

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

Czy ktoś może być uprzejmy w prowadzeniu mnie w sprawie uzyskania prawidłowego profilu użytkownika z Facebooka, w tym adresu e-mail użytkownika?

Dziękuję bardzo.

+1

Zmiany w API V2.4 dotyczące pól, patrz https://developers.facebook.com/docs/apps/changelog#v2_4_changes // Faktyczne żądanie API musi zostać odpowiednio zmienione; jeśli twój framework/SDK nie ujawnia ci tego żądania, musisz poprosić go o dostosowanie swojego kodu. – CBroe

+0

Sprawdź wersję paszportu-facebooka w płycie podstawowej. Miałem podobną sytuację i aktualizacja do wersji 2.0.0 rozwiązała problem. – dipole

Odpowiedz

0

Najpierw profileFields pole nie słuchać do Portable Contacts convention - i można znaleźć w Konwencji o passportjs here.

Po drugie, w twoim przykładzie, po usunięciu usuniętego "o_me", zapis na Facebooku nie zwraca błędu. Przed wyjęciem „O_mnie”, miałem inny błąd: Tried dostępu do nieistniejącego pole (O_mnie) od typu węzła (User)

Jeśli błąd nadal występuje, zobacz this serie 5 tutoriali, które pomaga mi, kiedy robi to zarejestruj się, aby uwierzytelnić się na kontach sieci społecznościowych.

0

mam moje pola profilu ustawione na poniższym

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

Nawet jeśli ustawić go pocztą elektroniczną e-maili może powrócić, jeśli użytkownik ma wiele e-maili. Musisz sprawdzić, czy e-mail został zwrócony profil.email lub profile.emails [0] .value. Musisz również sprawdzić, czy jest on nieokreślony, ponieważ istnieją osoby, które rejestrują się na Facebooku, które nigdy nie weryfikują swojego konta e-mail i są osoby, które rejestrują się za pomocą numeru telefonu, w obu przypadkach ich e-maile będą zawsze niezdefiniowane.

chcesz sprawdzić, czy wszystkie wymagane pola mają wartości.

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

teraz mogę to zrobić, jeśli mają one Email

newUser.facebook.email = email; 

jeśli nie mają e-mail można ustawić sesję dla profilu i wysyłać je do strony, która zwraca się do nich wprowadzić e-mail.

To brzmi jak ból, ale nigdy nie można ufać, że informacje z api stron trzecich mają wartości.

Większość przykładów paszportu, które widziałem w Internecie, jest błędnych. Wszyscy zakładają, że e-mail jest obecny.

Powiązane problemy