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?
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:
next(err)
; Dies wird von Express erledigt und generiert eine HTTP 500-Antwort.false
als Benutzerobjekt: next(null, false)
; dies löst den failureRedirect
aus (wenn Sie keinen definieren, wird eine nicht autorisierte HTTP 401-Antwort generiert);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);
});
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);
});
Sie müssen req.logIn(function (err) { });
hinzufügen und die Erfolgsumleitung innerhalb der Rückruffunktion durchführen