Ich habe es herausgefunden!
Zunächst müssen Sie die richtige Strategie umsetzen. In meinem Fall LocalStrategy, und Sie müssen Ihre Validierungslogik angeben. Verwenden wir zum Beispiel die in passport-local.
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
Der von Ihnen bereitgestellte Rückruf zur Überprüfung sorgt function(username, password, done)
dafür, dass Ihr Benutzer gefunden und überprüft wird, ob das Kennwort übereinstimmt (über den Rahmen der Frage und meiner Antwort hinaus).
passport.js erwartet, dass mehrere Teile funktionieren. Zum einen geben Sie den Benutzer in die Strategie zurück. Ich habe versucht, diesen Teil des Codes zu ändern, und das war falsch. Der Rückruf erwartet, false
wenn die Validierung fehlschlägt, und einen object
(validierten Benutzer), wenn Sie erfolgreich sind.
Nun ... wie kann man JWT integrieren?
In Ihrer Login-Route müssen Sie eine erfolgreiche oder eine nicht erfolgreiche Authentifizierung durchführen. Und hier müssen Sie die Erstellung des JWT-Tokens hinzufügen. Wie so:
(Denken Sie daran, die Sitzung zu deaktivieren, da Sie sonst die Funktionen zum Serialisieren und Deserialisieren implementieren müssen. Diese benötigen Sie nicht, wenn Sie die Sitzung nicht beibehalten, was Sie nicht tun, wenn Sie eine tokenbasierte Authentifizierung verwenden.)
Aus passpasslokalen Beispielen: (mit hinzugefügtem JWT-Token)
// POST /login
// This is an alternative implementation that uses a custom callback to
// achieve the same functionality.
app.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err) }
if (!user) {
return res.json(401, { error: 'message' });
}
//user has authenticated correctly thus we create a JWT token
var token = jwt.encode({ username: 'somedata'}, tokenSecret);
res.json({ token : token });
})(req, res, next);
});
Und das ist alles! Wenn Sie jetzt anrufen / sich anmelden und Benutzername und Passwort POSTEN (was immer über SSL erfolgen sollte), versucht das erste Code-Snippet oben, einen Benutzer anhand des von Ihnen angegebenen Benutzernamens zu finden, und überprüft dann, ob das Passwort übereinstimmt (natürlich müssen Sie dies tun) ändern Sie das, um Ihren Bedürfnissen zu entsprechen).
Danach wird Ihre Login-Route aufgerufen und Sie können sich darum kümmern, einen Fehler oder ein gültiges Token zurückzugeben.
Hoffe das wird jemandem helfen. Und wenn ich Fehler gemacht oder etwas vergessen habe, lass es mich wissen.
Dies ist eine großartige Lösung. Ich möchte nur Folgendes hinzufügen:
Ich verwende gerne "express-jwt" , um das Token zu validieren.
Übrigens: In diesem Artikel erfahren Sie, wie Sie mit dem Token auf der Clientseite mithilfe von Angular umgehen, um es bei jeder Anforderung zurückzusenden
https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
quelle
express-jwt
die Authentifizierung durchgeführt, aber ich habe die Dokumentation anderer Pakete durchgelesen, z. B.passport-jwt
ich denke, ich werde mich daran haltenexpress-jwt
. Viel einfacher, viel schöner IMOHier ist eine Boiler-Platte, an der ich gerade arbeite, um nur API-Token zu verwenden (keine Sitzungen ... nicht diese Sitzung ist natürlich schlecht; nur wir verwenden den Token-Ansatz): https://github.com/roblevintennis/passport -api-Token
quelle