node js passport-facebook 在 sails 中的策略认证

node js passport-facebook strategy authentication in sails

您好,我正在尝试使用 Facebook 登录来验证我的应用程序。为此,我正在使用 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)

错误提示你发生了什么,passport fns 是中间件,他们希望在 (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);
  }
};

所以综上所述,你需要在fn旁边传递passport.authenticatereturns