node.js - route - npm
Obtener objeto de solicitud en devoluciĆ³n de llamada de estrategia de pasaporte (3)
Así que aquí está mi configuración para la estrategia de pasaporte-facebook:
passport.use(new FacebookStrategy({
clientID: ".....",
clientSecret: ".....",
callbackURL: "http://localhost:1337/register/facebook/callback",
},
facebookVerificationHandler
));
Y aquí está facebookVerificationHandler:
var facebookVerificationHandler = function (accessToken, refreshToken, profile, done) {
process.nextTick(function () {
.......
});
};
¿Hay alguna manera de acceder al objeto de solicitud en FacebookVerificationHandler?
Los usuarios se registran en mi sitio con LocalStrategy, pero luego podrán agregar sus cuentas sociales y asociarlas a sus cuentas locales. Cuando se llama a la devolución de llamada anterior, el usuario que está conectado actualmente ya está disponible en req.user, así que necesito acceder a req para asociar al usuario con la cuenta de Facebook.
¿Es esta la forma correcta de implementarlo o debería considerar otra forma de hacerlo?
Gracias.
Hay una opción passReqToCallback
, consulte la parte inferior de esta página para obtener más información: http://passportjs.org/guide/authorize/
Por esta razón, en lugar de configurar la estrategia cuando se inicia la aplicación, generalmente configuro la estrategia cuando hay una solicitud. por ejemplo:
app.get(
''/facebook/login''
,passport_setup_strategy()
,passport.authenticate()
,redirect_home()
);
var isStrategySetup = false;
var passport_setup_strategy = function(){
return function(req, res, next){
if(!isStrategySetup){
passport.use(new FacebookStrategy({
clientID: ".....",
clientSecret: ".....",
callbackURL: "http://localhost:1337/register/facebook/callback",
},
function (accessToken, refreshToken, profile, done) {
process.nextTick(function () {
// here you can access ''req''
.......
});
}
));
isStrategySetup = true;
}
next();
};
}
Usando esto, tendrá acceso a la solicitud en su controlador de verificación.
Prueba esto.
exports.facebookStrategy = new FacebookStrategy({
clientID: ''.....'',
clientSecret: ''...'',
callbackURL: ''http://localhost:3000/auth/facebook/callback'',
passReqToCallback: true
},function(req,accessToken,refreshToken,profile,done){
User.findOne({
''facebook.id'' : profile.id
},function(err,user){
if(err){
done(err);
}
if(user){
req.login(user,function(err){
if(err){
return next(err);
}
return done(null,user);
});
}else{
var newUser = new User();
newUser.facebook.id = profile.id;
newUser.facebook.name = profile.displayName;
newUser.facebook.token = profile.token;
newUser.save(function(err){
if(err){
throw(err);
}
req.login(newUser,function(err){
if(err){
return next(err);
}
return done(null,newUser);
});
});
}
});
}
);
El usuario es un modelo de mangosta, guardo al usuario en DB.