2015-08-06 25 views
6

Tôi đang sử dụng bản mẫu soạn sẵn Meanjs.org và Đăng ký Facebook sẽ trả lại tôi đến trang Đăng ký. Sau đây là các bước mà tôi đã thực hiện cho đến thời điểm này.Đăng nhập Facebook đang trả về các trường 'Không xác định' trong hồ sơ người dùng và nó không trả lại email. MEANJs + Hộ chiếu-facebook

1) Thiết lập Facebook App URL Site

http://localhost:3000/

và gọi lại URI của OAuth

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

2) Đặt APP_ID và APP_Secret trong như Client_ID và 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) Mã là như sau

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

- Chức năng 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); 
    }; 
}; 

- Hộ chiếu-Facebook Chiến lược

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) Gỡ rối

Logging err dưới chức năng oauthCallback trả về sau,

1TypeError: Cannot read property '0' of undefined

gì Facebook trả về như hồ sơ cá nhân trong hộ chiếu Facebook module được như sau,

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

Bất cứ ai có thể được loại để hướng dẫn tôi về việc nhận được hồ sơ người dùng chính xác từ Facebook bao gồm cả email người dùng?

Cảm ơn bạn rất nhiều.

+1

Thay đổi API v2.4 liên quan đến các trường, xem https://developers.facebook.com/docs/apps/changelog#v2_4_changes // Yêu cầu API thực tế cần được sửa đổi cho phù hợp; nếu khung/SDK của bạn không hiển thị yêu cầu đó cho bạn thì bạn cần yêu cầu họ điều chỉnh mã của họ. – CBroe

+0

Kiểm tra phiên bản hộ chiếu-facebook trong bản mẫu. Tôi đã có một tình huống tương tự và nâng cấp lên phiên bản 2.0.0 đã giải quyết được vấn đề. – dipole

Trả lời

0

Đầu tiên, tiểu sửSản phẩm trường không tuân theo Portable Contacts convention - và bạn có thể tìm quy ước cho hộ chiếu here.

Thứ hai, trong ví dụ của bạn, sau khi xóa 'about_me' đã bị xóa, đăng ký Facebook sẽ không trả về lỗi nào. Trước khi tháo 'about_me', tôi đã có một lỗi khác nhau: Cố gắng tiếp cận lĩnh vực nonexisting (about_me) vào loại nút (Thành viên)

Nếu lỗi vẫn còn, thấy this serie 5 hướng dẫn giúp tôi khi tôi đang làm đăng ký trang để xác thực với các tài khoản mạng xã hội.

0

Tôi có trường hồ sơ của tôi thiết lập như sau

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

Mặc dù bạn thiết lập email cho nó có thể trở email nếu người dùng có nhiều email. Vì vậy, bạn cần phải kiểm tra xem email đã được trả về profile.email hoặc profile.emails [0] .value. Bạn cũng phải kiểm tra nếu nó không xác định, bởi vì có những người đăng ký với facebook mà không bao giờ xác minh tài khoản email của họ và có những người đăng ký bằng số điện thoại, trong cả hai trường hợp, email của họ sẽ luôn không được xác định.

bạn muốn kiểm tra xem mọi trường bắt buộc có giá trị hay không.

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

bây giờ tôi có thể làm điều này nếu họ có một email

newUser.facebook.email = email; 

nếu họ không có một email mà bạn có thể thiết lập một phiên cho cấu hình và gửi chúng đến một trang yêu cầu họ nhập Một email.

Nghe có vẻ giống như một nỗi đau, nhưng bạn không bao giờ có thể tin tưởng thông tin từ api của bên thứ ba để có giá trị.

Hầu hết các ví dụ hộ chiếu mà tôi đã xem trực tuyến đều sai. Tất cả đều giả định một email là hiện tại.

Các vấn đề liên quan