webentwicklung-frage-antwort-db.com.de

Express Passport (node.js) Fehlerbehandlung

Ich habe mir über diesen Stapelaustausch angeschaut, wie die Fehlerbehandlung im Knoten funktionieren soll, bin mir aber nicht sicher, was der Pass tut, wenn die Authentifizierung fehlschlägt. Ich habe folgende LocalStrategy:

passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' },
  function(email, password, next) {

    User.find({email: UemOrUnm}, function(err, user){
      if (err) { console.log('Error > some err'); return next(err); }
      if (!user) { console.log('Error > no user'); return next('Incorrect login or password'); } 

      if (password != user.password) {
        return next(Incorrect login or password);
      }
      return next(null, user);
    });
  }
));

Nachdem der Konsolendruck "Fehler> Irrtum" angezeigt wurde, passiert nichts anderes. Ich würde denken, dass es auf dem nächsten Pfad mit einem Fehlerparameter fortgesetzt werden sollte, aber es scheint, das nicht zu tun. Was ist los?

64
Omid Ahourai

Die Strategie-Implementierung arbeitet in Verbindung mit passport.authenticate, Um sowohl eine Anfrage zu authentifizieren als auch Erfolg/Misserfolg zu behandeln.

Angenommen, Sie verwenden diese Route (die eine E-Mail-Adresse und ein Passwort enthält):

app.post('/login', passport.authenticate('local', {
  successRedirect: '/loggedin',
  failureRedirect: '/login', // see text
  failureFlash: true // optional, see text as well
});

Dadurch wird der Code in der Strategie aufgerufen, wobei eine von drei Bedingungen eintreten kann:

  1. Beim Abrufen der Benutzerinformationen ist ein interner Fehler aufgetreten (z. B. wenn die Datenbankverbindung unterbrochen ist). Dieser Fehler würde weitergegeben werden: next(err); Dies wird von Express erledigt und generiert eine HTTP 500-Antwort.
  2. Die angegebenen Anmeldeinformationen sind ungültig (es gibt keinen Benutzer mit der angegebenen E-Mail-Adresse oder das Kennwort stimmt nicht überein). In diesem Fall erzeugen Sie keinen Fehler, sondern übergeben ein false als Benutzerobjekt: next(null, false); dies löst den failureRedirect aus (wenn Sie keinen definieren, wird eine nicht autorisierte HTTP 401-Antwort generiert);
  3. Alles checkt aus, Sie haben ein gültiges Benutzerobjekt, also geben Sie es weiter: next(null, user); dies wird den successRedirect auslösen;

Im Falle einer ungültigen Authentifizierung (aber nicht eines internen Fehlers) können Sie eine zusätzliche Nachricht zusammen mit dem Rückruf übergeben:

next(null, false, { message : 'invalid e-mail address or password' });

Wenn Sie failureFlash und installiert haben die Connect-Flash-Middleware , wird die gelieferte Nachricht in der Sitzung gespeichert und kann leicht abgerufen werden, z B. in einer Vorlage verwendet werden.

BEARBEITEN: Es ist auch möglich, das Ergebnis des Authentifizierungsprozesses vollständig selbst zu bearbeiten (anstatt Passport eine Umleitung oder 401 zu senden):

app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) {
      return next(err); // will generate a 500 error
    }
    // Generate a JSON response reflecting authentication status
    if (! user) {
      return res.send({ success : false, message : 'authentication failed' });
    }
    // ***********************************************************************
    // "Note that when using a custom callback, it becomes the application's
    // responsibility to establish a session (by calling req.login()) and send
    // a response."
    // Source: http://passportjs.org/docs
    // ***********************************************************************
    req.login(user, loginErr => {
      if (loginErr) {
        return next(loginErr);
      }
      return res.send({ success : true, message : 'authentication succeeded' });
    });      
  })(req, res, next);
});
156
robertklep

Was Christian sagte, war, dass Sie die Funktion hinzufügen müssen

req.login(user, function(err){
  if(err){
    return next(err);
  }
  return res.send({success:true});
});

Die gesamte Route wäre also:

app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) {
      return next(err); // will generate a 500 error
    }
    // Generate a JSON response reflecting authentication status
    if (! user) {
      return res.send(401,{ success : false, message : 'authentication failed' });
    }
    req.login(user, function(err){
      if(err){
        return next(err);
      }
      return res.send({ success : true, message : 'authentication succeeded' });        
    });
  })(req, res, next);
});

quelle: http://passportjs.org/guide/login/

18
cpoole

Sie müssen req.logIn(function (err) { }); hinzufügen und die Erfolgsumleitung innerhalb der Rückruffunktion durchführen

2