2013-02-19 6 views
29

Ich verwende Passport.js, um einen Benutzer mit Benutzername und Passwort anzumelden. Ich verwende im Wesentlichen den Beispielcode von der Passport-Site. Hier sind die relevanten Teile meines Codes:Passport.js: Wie kann nach der Authentifizierung auf das Benutzerobjekt zugegriffen werden?

app.use(passport.initialize()); 
app.use(passport.session()); 

passport.serializeUser(function(user, done) { 
    done(null, user); 
}); 

passport.deserializeUser(function(obj, done) { 
    done(null, obj); 
}); 

passport.use(new LocalStrategy(function(username, password, done) { 
    User.findOne({ username: username }, function(err, user) { 
     if (err) { 
      return done(err); 
     } 
     if (!user) { 
      return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
      return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
     }); 
    } 
)); 

app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/login/fail', failureFlash: false }), 
    function(req, res) { 
     // Successful login 
     //console.log("Login successful."); 
     // I CAN ACCESS req.user here 
}); 

Dies scheint richtig zu loggen. Allerdings würde ich gerne in der Lage sein, die Informationen des angemeldeten Benutzers in anderen Teilen für den Zugriff des Codes, wie zum Beispiel:

app.get('/test', function(req, res){ 
    // How can I get the user's login info here? 
    console.log(req.user); // <------ this outputs undefined 
}); 

ich weitere Fragen auf SO geprüft habe, aber ich bin mir nicht sicher, was ich tue falsch hier. Vielen Dank!

Antwort

5

Sie müssen sicherstellen, dass Sie eine middleware registrieren, die req.session vor der Registrierung der Pass-Middlewares besiedelt.

Zum Beispiel für folgende Verwendungszwecke express cookieSession middleware

app.configure(function() { 

    // some code ... 

    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.cookieSession()); // Express cookie session middleware 
    app.use(passport.initialize()); // passport initialize middleware 
    app.use(passport.session());  // passport session middleware 

    // more code ... 

}); 
+51

Dieser Setup-Code für die Unterstützung gibt nicht an, wie der Benutzer schließlich aus der Sitzung übernommen wird. –

38

spät zur Party, aber fanden diese unbeantwortet, nachdem die Antwort selbst googeln.

Innerhalb der Anfrage wird ein req.user Objekt, mit dem Sie arbeiten können.

Routen wie folgt:

app.get('/api/portfolio', passport.authenticate('jwt', { session: false }), stocks.buy); 

Controller wie folgt aus:

buy: function(req, res) { 
     console.log(req.body); 
     //res.json({lel: req.user._id}); 
     res.json({lel: req.user}); 
    } 
+5

Dies sollte die richtige Antwort sein, da es das Problem direkter anspricht ... Im Falle einer zustandslosen REST-API ist dies der Cay to go ... –

+1

Was ist, wenn nach dem Einloggen req.user als undefiniert erscheint? – Aspen

1

In Bezug auf die Passport documentation wird das Benutzerobjekt in req.user enthalten. Siehe unten.

app.post('/login', 
     passport.authenticate('local'),function(req, res) { 
     // If this function gets called, authentication was successful. 
     // `req.user` contains the authenticated user. 
     res.redirect('/users/' + req.user.username); 
    }); 

Auf diese Weise können Sie von der Seite, auf die Sie umleiten, auf Ihr Benutzerobjekt zugreifen.

Falls Sie stecken bleiben, können Sie sich auf my Github project beziehen, wo ich es klar implementiert habe.

+0

Genau das habe ich gesucht! Ich habe nie herausgefunden, wo ich eigentlich auf req.user zugreifen kann, und das fasst es perfekt zusammen. Vielen Dank! – Rahul

Verwandte Themen