10

En la devolución de llamada de Facebook para la autenticación de pasaporte nodejs, ¿cómo se obtiene el objeto req dentro de la devolución de llamada?Passport-facebook access req objeto desde la función de devolución de llamada

passport.use(new FacebookStrategy({ 
    clientID: 123456789, 
    clientSecret: 'SECRET', 
    callbackURL: "http://example.com/login/facebook/callback" 
    }, 
    function(accessToken, refreshToken, profile, done){ 
    // Is there any way to get the req object in here? 
    } 
)); 

Respuesta

15

se establece la opción passReqToCallback, como tan:

passport.use(new LocalStrategy({ passReqToCallback: true }, 
    function(req, username, password, done) { 
    User.findOne({ username: username }, function (err, user) { 
     if (err) { return done(err); } 
     if (!user) { return done(null, false); } 
     if (!user.verifyPassword(password)) { 
     req.flash('error', 'Your password is too long'); 
     req.flash('error', 'Also, it is too short!!!'); 
     return done(null, false); 
     } 
     return done(null, user); 
    }); 
    } 
)); 

req se convierte en el primer argumento de la devolución de llamada verificar

Según https://github.com/jaredhanson/passport/issues/39

+1

Esto también funciona para mí con la autenticación de Facebook. – TulioPa

+0

¡Gracias! Esta fue una gran ayuda. – Tyguy7

5

estoy respondiendo demasiado tarde, pero Creo que mi solución es mejor y más convencional. En la documentación oficial here. Hay una sección de "Asociación de Compruebe devolución de llamada", en el que se menciona que si establecemos opción passReqToCallback de la estrategia para cierto, esto permite req y se pasa como primer argumento al verificar llamar de vuelta.

Así que mi FacebookStrategy ahora queda como:

var User = require('../models/UserModel.js'); 
var FacebookStrategy = require('passport-facebook').Strategy; 

exports.facebookStrategy = new FacebookStrategy({ 
     clientID: 'REPLACE_IT_WITH_CLIENT_ID', 
     clientSecret: 'REPLACE_IT_WITH_CLIENT_SECRET', 
     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); 
        }); 
       }); 
      } 
     }); 
    } 
); 

En mi ejemplo de código que he añadido algo de lógica para guardar la información del usuario en la base de datos y guardar los datos de usuario en sesión. Pensé que podría ser útil para las personas.

req.user proporciona la información del usuario almacenado en la sesión de pasaporte.

+0

¡¡Gracias !! Esta fue una gran ayuda. – Tyguy7

Cuestiones relacionadas