2016-04-10 4 views
5

Mit Passport.js schreibe ich die Route auf diese Weise, so habe ich Zugriff auf das MongoDb Dokument userDoc. Aber wenn es so geht ... passport.serializeUser() wird nie aufgerufen und das req Objekt wird user fehlen.Passport serializeUser() wird nicht mit diesem authenticate() Callback aufgerufen

auth.route('/auth/facebook/callback') 
    .get(function(req, res, next) { 
    passport.authenticate('facebook', function(err, userDoc, info) { 
     if (err) { return next(err); } 
     // I don't think !userDoc will ever happen because of mongo upsert 
     if (!userDoc) { return res.redirect('/login'); } 
     res.cookie('facebookPicUrl', userDoc.value.facebook.picture, {maxAge : 9999999, 
     httpOnly: false, 
     secure: false, 
     signed: false 
     }); 

     res.redirect('http://localhost:9000/users') 
    })(req, res, next); 
    }); 

Aber wenn ich es auf diese Weise zu schreiben, ist die req.user dort, wie es sein sollte:

auth.route('/auth/facebook/callback') 
    .get(passport.authenticate('facebook', { failureRedirect: '/login' }), 
     function(req, res) { 
     res.redirect('http://localhost:9000/users') 
    }); 

Wie kann ich das machen, wo passport.serializeUser genannt wird und user existiert auf req und ich habe auch Zugang zum mongoDb-Objekt?

Antwort

9

Da Sie den benutzerdefinierten Authentifizierungsrückruf verwenden, sind Sie für das Einrichten der Sitzung verantwortlich.

Beachten Sie, dass, wenn eine benutzerdefinierte Callback verwenden, ist es die Verantwortung des wird Anwendung eine Sitzung einzurichten (durch den Aufruf req.login()) und eine Antwort senden.

req.login() weist das user Objekt zu dem Request-Objekt req als req.user, sobald der Anmeldevorgang abgeschlossen ist.

Sie können zum Beispiel sehen, dass in der Dokumentation req.login() explizit in dem benutzerdefinierten Rückruf aufgerufen wird:

app.get('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next); 
}); 
+0

Wow! Soweit ich weiß, wurde dies nicht direkt auf der Passport.js-Website dokumentiert. Sie sagen, dass pass.authenticate() req.login() aufruft, aber mir war nicht bewusst, dass sie manuell aufgerufen werden musste, wenn ein benutzerdefinierter Callback bereitgestellt wurde. Die Dokumente sind so vage! – OzzyTheGiant