2016-11-07 142 views
0

我一直在試圖解決這個問題,但我找不到我的錯誤。我一直在客戶端使用JavaScript一段時間,並開始編寫一本書。不幸的是,自從那時起,Facebook似乎已經改變了他們的oauth方法(例如,用戶名似乎被棄用)。所以我的問題是這樣的。要麼如果我還沒有登錄到Facebook,我會重定向到FB。我登錄,但卡在其網站上。 但是,如果我被鎖定,我的瀏覽器會持續加載一分鐘或2分鐘,然後告訴我授權密鑰已被使用。我希望也許你能幫助我。我的環境文件看起來像這樣Facebook OAuth卡住

(development.js)

module.exports = { 
//Development configuration options 
db    : 'mongodb://localhost/mean-book', 
sessionSecret : 'developmentSessionSecret', 
facebook  : { 
    clientId  : '*************', 
    clientSecret : '************************', 
    callbackURL  : 'http://localhost:3000/oauth/facebook/callback' 
} 
}; 

的developers.facebook頁我已經把我的應用程序域到本地主機上,而該網站的URL http://localhost:3000/oauth/facebook/callback。我嘗試了很多變化。目前爲止沒有任何幫助這是我的策略是什麼樣子

facebook.js

var passport  = require('passport'), 
url    = require('url'), 
FacebookStrategy = require('passport-facebook').Strategy, 
config   = require('../config'), 
users   = require('../../app/controllers/users.server.controller'); 

module.exports = function(){ 
    passport.use(new FacebookStrategy({ 
     clientID   : config.facebook.clientId, 
     clientSecret  : config.facebook.clientSecret, 
     callbackURL   : config.facebook.callbackURL, 
     profileFields  : ['id','email', 'name', 'displayName', 'gender', 'profileUrl'], 
     passReqToCallback : true 
    }, 
    function(req, accessToken, refreshToken, profile, done){ 
     var providerData   = profile._json; 
     providerData.accessToken = accessToken; 
     providerData.refreshToken = refreshToken; 
     console.log('------PROFILE-----'); 
     console.log(profile); 
     console.log('------END PROFILE-------') 
     var providerUserProfile  = { 
      firstName : profile.name.givenName, 
      lastName : profile.name.familyName, 
      fullName : profile.displayName, 
      username : profile.id, 
      email  : profile.emails[0].value, 
      provider : 'facebook', 
      providerId : profile.id, 
      providerData: providerData 
     }; 
     console.log('---------------'); 
     console.log(providerUserProfile); 
     console.log('---------------') 
     users.saveOAuthUserProfile(req, providerUserProfile, done); 
    })); 
}; 

我的護照的配置看起來像這樣

(passport.js)

var passport = require('passport'), 
    mongoose = require('mongoose'); 

    module.exports = function(){ 
     var User = mongoose.model('User'); 

     passport.serializeUser(function(user, done){ 
      done(null, user.id); 
     }); 

     passport.deserializeUser(function(id, done){ 
      User.findOne({ 
       _id: id 
      }, '-password -salt', function(err, user){ 
       done(err, user); 
      }); 
     }); 

     require('./strategies/local.js')(); 
     require('./strategies/facebook.js')(); 
    }; 

,最後我的路線使用此方法

exports.saveOAuthUserProfile = function(req, profile, done){ 
    User.findOne({ 
     provider : profile.provider, 
     providerId : profile.providerId 
    }, function(err, user){ 
     if(err){ 
      return done(err); 
     } else { 
      if(!user){ 
       var possibleUsername = profile.username || ((profile.email) ? profile.email.split('@')[0] : ''); 
      } 
     } 
    }); 
} 

首先感謝您通過所有此代碼來提供幫助。我真的很感激,因爲我相當迷失在這裏。再次感謝並

問候克里斯

回答

0

你錯過來電done功能,如果FB用戶成功授權

exports.saveOAuthUserProfile = function(req, profile, done){ 
    User.findOne({ 
     provider : profile.provider, 
     providerId : profile.providerId 
    }, function(err, user){ 
     if(err){ 
      return done(err); 
     } else { 
      if(!user){ 
       user.possibleUsername = profile.username || ((profile.email) ? profile.email.split('@')[0] : ''); 
      } 
      done(null, user); 
     } 
    }); 
} 
+0

呀。也發現了這一點,並即將發佈。有時答案可以非常簡單:)。非常感謝 – Chris