10

Nel callback da Facebook per l'autenticazione passport del nodojs, come si ottiene l'oggetto req all'interno del callback?Oggetto req di accesso Passport-facebook dalla funzione di callback

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

risposta

15

Impostare l'opzione passReqToCallback, come così:

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 diventa il primo argomento alla callback

verificare Secondo https://github.com/jaredhanson/passport/issues/39

+1

Questo funziona anche per me con l'autenticazione di Facebook. – TulioPa

+0

Grazie !! Questo è stato di grande aiuto. – Tyguy7

5

sto rispondendo troppo tardi, ma penso che la mia soluzione sia migliore e più convenzionale. Nella documentazione ufficiale here. C'è una sezione "Association nel Verificare richiamata", in cui si dice che se impostiamo passReqToCallback opzione della strategia per vero, questo permette req e sarà passato come primo argomento per la verifica richiama.

Quindi il mio FacebookStrategy ora assomiglia:

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

Nel mio esempio di codice ho aggiunto un po 'di logica per salvare le informazioni utente nel DB e il salvataggio dati utente in sessione. Ho pensato che potesse essere utile alle persone.

req.user fornisce le informazioni dell'utente memorizzato nella sessione del passaporto.

+0

Grazie !! Questo è stato di grande aiuto. – Tyguy7

Problemi correlati