2016-08-19 5 views
1

こんにちは私はFacebookのログインを使用して私のアプリを認証しようとしています。この目的のために、私はパスポート - フェイスブックを使用しています。私のコードは、以下与えている:ここでノードjs passport-facebook戦略セイルの認証

//config/passport.js 
var passport = require('passport'); 
var FacebookStrategy = require('passport-facebook').Strategy; 
var FACEBOOK_STRATEGY_CONFIG = { 
    clientID  : 'xxxxxxxxxxxxxxxxxxxxx', 
    clientSecret : 'xxxxxxxxxxxxxxxxxxxxx', 
    callbackURL  :'http://test.com:3000/auth/facebook/callback' 
}; 
function onFacebookStrategyAuth(token, refreshToken, profile, done){ 

UserCredentials.findOne({'facebook.id' : profile.id}).then(user => { 
    if(user) 
    return done(null, user); 
    else{ 
    var newUser = {}; 
    newUser.facebook.id = profile.id; 
    newUser.facebook.token = token; 
    newUser.facebook.name = profile.name.givenName + ' ' + profile.name.familyName; 
    newUser.facebook.email = profile.emails[0].value; 
    return UserCredentials.create(newUser); 
    } 
}).then(created => done(null,created)).catch(err => done(err, false)); 

} 
passport.use(new FacebookStrategy(FACEBOOK_STRATEGY_CONFIG, onFacebookStrategyAuth)); 

私AuthController.js

//controllers/AuthController.js 
var passport = require('passport'); 
module.exports = { 
    facebook : function(req,res){ 
    passport.authenticate('facebook',{scope : 'email'})(req, res); 
    }, 

    facebookCallback : function(req, res){ 
    passport.authenticate('facebook',{ 
     successRedirect : '/success', 
     failureRedirect : '/fail' 
    })(req, res); 
    } 
}; 

私は送信ボタンをクリックして、私の私のボタンアクションを送信すると、私のconfig/route.js

module.exports.routes = { 
    '/auth/facebook': 'AuthController.facebook', 
    '/auth/facebook/callback': 'AuthController.facebookCallback', 
    '/success': {view : 'success'}, 
    '/fail': {view : 'fail' } 
    } 

です'/ auth/facebook'と定義されています。しかし、私はコンソールに次のエラーを取得:

/node_modules/passport/lib/middleware/authenticate.js:343 
     next(err); 
     ^
TypeError: next is not a function 
    at Strategy.strategy.error (/home/harsh/Desktop/cmbackend/node_modules/passport/lib/middleware/authenticate.js:343:9) 
    at /home/harsh/Desktop/cmbackend/node_modules/passport-oauth2/lib/strategy.js:166:34 
    at /home/harsh/Desktop/cmbackend/node_modules/oauth/lib/oauth2.js:177:18 
    at passBackControl (/home/harsh/Desktop/cmbackend/node_modules/oauth/lib/oauth2.js:123:9) 
    at IncomingMessage.<anonymous> (/home/harsh/Desktop/cmbackend/node_modules/oauth/lib/oauth2.js:143:7) 
    at emitNone (events.js:72:20) 
    at IncomingMessage.emit (events.js:166:7) 
    at endReadableNT (_stream_readable.js:905:12) 
    at nextTickCallbackWith2Args (node.js:441:9) 
    at process._tickDomainCallback (node.js:396:17) 

答えて

1

エラーが起こっている何をほのめかしている、パスポートFNSはミドルウェアあり、彼らはあなたがここに2つのオプションがあり(req, res, next)nextコールバックを受け取ることを期待しています。

このように、コントローラのアクションに直接ミドルウェアを割り当てます

var passport = require('passport'); 
module.exports = { 
    facebook : passport.authenticate('facebook',{scope : 'email'}), 

    facebookCallback :passport.authenticate('facebook', 
     {successRedirect : '/success', failureRedirect : '/fail'} 
    ) 
}; 

またはこのような、場合にあなたがアクションに何かを行う必要があります(それとも、ここで何が起こっているかにより明確にします)

var passport = require('passport'); 
module.exports = { 
    facebook : function(req,res, next){ 
    // do something else here 
    passport.authenticate('facebook',{scope : 'email'})(req, res, next); 
    }, 

    facebookCallback : function(req, res){ 
    // You can do something else here 
    passport.authenticate('facebook',{ 
     successRedirect : '/success', 
     failureRedirect : '/fail' 
    })(req, res, next); 
    } 
}; 

だから要約すると、次の

を返しpassport.authenticate FNに渡す必要があります
関連する問題