/ Autenticación de la estrategia de / pass / facebook de js passport - node.js, express, sails.js, passport-facebook

Autenticación de la estrategia del nodo js passport-facebook en las velas - node.js, express, sails.js, passport-facebook

Hola, estoy intentando autenticar mi aplicación usando el inicio de sesión de facebook. Para ello estoy utilizando pasaporte-facebook. Mi código es el siguiente:

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

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

Aquí está mi config / route.js

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

Cuando hago clic en el botón Enviar y mi acción de botón Enviar se define como "/ auth / facebook". Pero me sale el siguiente error en la consola:

/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)

Respuestas

1 para la respuesta № 1

El error le está indicando lo que está pasando, los pasaportes fns son middleware, esperan recibir el next devolución de llamada en (req, res, next) Así que tienes dos opciones aquí.

Asigna el middleware directamente a la acción del controlador, de esta manera:

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

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

O así, en caso de que necesites hacer algo más en la acción (o simplemente para ser más claro sobre lo que está pasando aquí)

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

Así que para resumir, debe pasar junto a fn passport.authenticate devuelve