2014-10-07 6 views
5

Wie ich the documentation, wenn ich Authentifizierung Anfragen wie so behandeln würde, wäre ich in der Lage, erfolgreiche Versuche zu erfassen.Wie mit nicht autorisierten Anfragen mit Nodejs/Reisepass umgehen

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

Aber, wie die Dokumentation sagt:

standardmäßig, wenn die Authentifizierung fehlschlägt, wird Passport mit einem 401 Unauthorized Status reagieren und alle zusätzlichen Route-Handler aufgerufen werden, wird nicht. Wenn die Authentifizierung erfolgreich ist, wird der nächste Handler aufgerufen und die Eigenschaft req.user wird auf den authentifizierten Benutzer gesetzt.

Wie kann ich mit dem nicht autorisierten Anmeldeversuch umgehen?

Ich weiß, dass ich mit benutzerdefinierten Middleware umgehen kann, aber gibt es einen besseren Weg?

Antwort

10

Sie sollten sich den Custom Callback Abschnitt in passport docs ansehen, der erklärt, wie das eingebaute Verhalten beim Behandeln einer Authentifizierungsanforderung überschrieben wird. Sie können einen benutzerdefinierten Rückruf schreiben, der den Zweck der done-Funktion übernimmt, die Sie aus der Strategie aufrufen.

app.get('/login', function(req, res, next) { 
    /* look at the 2nd parameter to the below call */ 
    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); 
}); 

Blick auf den zweiten Parameter an die passport.authenticate Anruf, der als getan Funktion dienen würde, die Sie von der lokalen Strategie aufrufen.

Siehe die Done-Funktion, die im folgenden Code aufgerufen wird, die die lokale Strategie, die Sie für den Pass definieren. Sie können die Done-Funktion mit verschiedenen verfügbaren Parametern wie err, user, info aufrufen, die aus der Strategie entsprechend der Antwort von API-Aufruf oder DB-Operation gesetzt werden. Diese Parameter werden von der obigen Funktionsdefinition unter passport.authenticate Aufruf verarbeitet.

passport.use(new LocalStrategy(
    function(username, password, done) { 
    /* see done being invoked with different paramters 
     according to different situations */ 
    User.findOne({ username: username }, function (err, user) { 
     if (err) { return done(err); } 
     if (!user) { return done(null, false); } 
     if (!user.verifyPassword(password)) { return done(null, false); } 
     return done(null, user); 
    }); 
    } 
)); 
+1

danke, funktioniert super – Joseph

Verwandte Themen