10

Auf den Rückruf von Facebook für Nodejs Reisepass-Authentifizierung, wie erhalten Sie das req Objekt innerhalb des Rückrufs?Passport-facebook Zugriff req Objekt aus Callback-Funktion

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

Antwort

15

Einstellen der passReqToCallback Option, wie so:

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 wird das erste Argument für den Rückruf überprüfen

Per https://github.com/jaredhanson/passport/issues/39

+1

Das funktioniert auch bei mir mit Facebook-Authentifizierung. – TulioPa

+0

Danke !! Das war eine große Hilfe. – Tyguy7

5

ich es zu spät bin zu antworten, aber Ich denke, dass meine Lösung besser und konventioneller ist. In der offiziellen Dokumentation here. Es gibt einen Abschnitt „Verband in Rückruf Überprüfen“, in dem darauf hingewiesen wird, dass, wenn wir die Strategie der gesetzt passReqToCallback Option wahr, dies ermöglicht erf und es wird als erstes Argument an die Verifizierungs weitergegeben Rückrufen.

Also mein FacebookStrategy sieht nun wie:

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

In meinem Code Probe ich einige Logik hinzugefügt haben Benutzer Informationen in DB und Speichern von Benutzerdaten in der Sitzung zu speichern. Ich dachte, es könnte für Leute hilfreich sein.

req.user gibt die Informationen des Benutzers in Pass Sitzung gespeichert.

+0

Danke !! Das war eine große Hilfe. – Tyguy7