2016-11-07 98 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