Die Strategie-Implementierung funktioniert in Verbindung mit passport.authenticate
sowohl zum Authentifizieren einer Anfrage als auch zum Behandeln von Erfolg/Misserfolg.
Sagen Sie diesen Weg zu verwenden (die eine E-Mail-Adresse und ein Passwort übergeben wird):
app.post('/login', passport.authenticate('local', {
successRedirect: '/loggedin',
failureRedirect: '/login', // see text
failureFlash: true // optional, see text as well
});
Dies wird den Code in der Strategie nennen, wo eine von drei Bedingungen passieren kann:
- Beim Abrufen der Benutzerinformationen ist ein interner Fehler aufgetreten (z. B. die Datenbankverbindung ist verschwunden); Dieser Fehler würde weitergegeben werden:
next(err)
; Dies wird von Express verarbeitet und generiert eine HTTP 500-Antwort.
- 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 generieren Sie keinen Fehler, aber Sie übergeben eine
false
als Benutzerobjekt: next(null, false)
; Dies löst die failureRedirect
aus (wenn Sie keine definieren, wird eine nicht autorisierte HTTP 401-Antwort generiert);
- Alles auscheckt, Sie haben ein gültiges Benutzerobjekt, so dass Sie es weitergeben:
next(null, user)
; Dies wird die successRedirect
auslösen;
Bei einer ungültigen Authentifizierung (aber nicht ein interner Fehler), 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 verwendet haben failureFlash
und installiert the connect-flash middleware, die Die mitgelieferte Nachricht wird in der Sitzung gespeichert und kann leicht abgerufen werden, um beispielsweise in einer Vorlage verwendet zu werden.
EDIT: es ist auch möglich, vollständig das Ergebnis des Prozesses selbst Authentifizierung zu umgehen (anstelle von Passport eine Umleitung oder 401 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);
});
Dank! Ich vermute, in meinem Fall versuche ich eine fehlgeschlagene Antwort über Ajax zu senden, anstatt eine Weiterleitung zu machen.Wenn ich mir die Passdokumente anschaue, denke ich, dass ich meine Route stattdessen mit einem benutzerdefinierten Funktionsrückruf formatieren muss. –
Wenn es hilft, habe ich meine Antwort bearbeitet, um eine mögliche Art der Authentifizierung selbst zu zeigen :) – robertklep
Danke für die Bearbeitung der "Authentifizierung selbst", das war ein Lebensretter! – wulftone