sails中的节点js passport-facebook策略authentication

你好我试图使用Facebookloginauthentication我的应用程序。 为此,我正在使用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' } } 

当我点击提交button,我的提交button动作被定义为'/ 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) 

错误是暗示你正在发生什么,护照fns是中间件,他们希望在(req, res, next)接收nextcallback,所以你在这里有两个select。

直接将中间件分配给控制器操作,如下所示:

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

所以总结一下,你需要通过fn passport.authenticate返回