Rozgryzłem to!
Przede wszystkim musisz wdrożyć odpowiednią strategię. W moim przypadku LocalStrategy i musisz podać swoją logikę walidacji. Na przykład sake użyjmy tego w paszporcie lokalnym.
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);
});
}
));
oddzwonienie weryfikacyjne, które podasz function(username, password, done)
, zajmie się odnalezieniem Twojego użytkownika i sprawdzeniem zgodności hasła (poza zakresem pytania i mojej odpowiedzi)
passport.js oczekuje, że zadziała kilka elementów, jednym z nich jest zwrócenie użytkownika w strategii. Próbowałem zmienić tę część kodu i to było złe. Wywołanie zwrotne oczekuje, false
jeśli walidacja się nie powiedzie, i object
(zweryfikowanego użytkownika), jeśli zakończy się pomyślnie.
Teraz… jak zintegrować JWT?
Na swojej trasie logowania będziesz musiał obsłużyć udaną lub nieudaną autoryzację. I to tutaj musisz dodać tworzenie tokena JWT. Tak jak to:
(pamiętaj, aby wyłączyć sesję, w przeciwnym razie będziesz musiał zaimplementować funkcje serializacji i deserializacji. I nie potrzebujesz ich, jeśli nie utrzymujesz sesji, czego nie jesteś, jeśli używasz uwierzytelniania opartego na tokenach)
Z lokalnych przykładów paszportowych: (z dodanym tokenem JWT)
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' });
}
var token = jwt.encode({ username: 'somedata'}, tokenSecret);
res.json({ token : token });
})(req, res, next);
});
I to jest to! Teraz, gdy dzwonisz / logujesz się i POST nazwa użytkownika i hasło (które zawsze powinny być przez SSL), pierwszy fragment kodu powyżej spróbuje znaleźć użytkownika na podstawie podanej nazwy użytkownika, a następnie sprawdź, czy hasło jest zgodne (oczywiście będziesz musiał zmień to do swoich potrzeb).
Następnie zostanie wywołana Twoja trasa logowania i tam możesz zająć się zwróceniem błędu lub ważnego tokena.
Mam nadzieję, że to komuś pomoże. A jeśli popełniłem jakieś błędy lub zapomniałem o czymś, daj mi znać.
To świetne rozwiązanie, chcę tylko dodać to:
var expressJwt = require('express-jwt'); app.use('/api', expressJwt({secret: secret}));
Lubię używać "express-jwt" do walidacji tokena.
btw: ten artykuł jest świetny, aby dowiedzieć się, jak obsługiwać token po stronie klienta za pomocą Angular, aby odsyłać go z każdym żądaniem
https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
źródło
express-jwt
dokonywałem uwierzytelniania, ale czytałem dokumentację innych pakietów, takich jakpassport-jwt
, myślę, że będę się trzymaćexpress-jwt
. O wiele prostsze, dużo ładniejsze IMOOto podstawa, nad którą pracuję, specjalnie do używania tylko tokenów API (bez sesji ... oczywiście nie ta sesja jest zła; po prostu używamy podejścia tokenowego): https://github.com/roblevintennis/passport -api-tokens
źródło