Je l'ai compris!
Tout d'abord, vous devez mettre en œuvre la bonne stratégie. Dans mon cas, LocalStrategy, et vous devez fournir votre logique de validation. Par exemple, utilisons celui de passeport 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);
});
}
));
le rappel de vérification que vous fournissez function(username, password, done)
se chargera de trouver votre utilisateur et de vérifier si le mot de passe correspond (au-delà de la portée de la question et de ma réponse)
passeport.js attend plusieurs éléments pour que cela fonctionne, l'un est que vous renvoyez l'utilisateur dans la stratégie. J'essayais de changer cette partie du code, et c'était faux. Le rappel attend false
si la validation échoue et un object
(l'utilisateur validé) si vous réussissez.
Maintenant .... comment intégrer JWT?
Dans votre itinéraire de connexion, vous devrez gérer une authentification réussie ou infructueuse. Et c'est ici que vous devez ajouter la création de jeton JWT. Ainsi:
(n'oubliez pas de désactiver la session, sinon vous devrez implémenter les fonctions de sérialisation et de désérialisation. Et vous n'en avez pas besoin si vous ne persistez pas la session, ce que vous n'êtes pas si vous utilisez une authentification basée sur un jeton)
À partir d'exemples locaux de passeport: (avec le jeton JWT ajouté)
// 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);
});
Et c'est tout! Maintenant, lorsque vous appelez / connectez-vous et POST le nom d'utilisateur et le mot de passe (qui doivent toujours être sur SSL), le premier extrait de code ci-dessus essaiera de trouver un utilisateur en fonction du nom d'utilisateur que vous avez fourni, puis vérifiera que le mot de passe correspond (bien sûr, vous devrez changez-le en fonction de vos besoins).
Après cela, votre itinéraire de connexion sera appelé et vous pourrez y retourner une erreur ou un jeton valide.
J'espère que cela aidera quelqu'un. Et si j'ai commis des erreurs ou oublié quelque chose, faites-le moi savoir.
C'est une excellente solution, je veux juste ajouter ceci:
J'aime utiliser "express-jwt" pour valider le jeton.
btw: cet article est idéal pour apprendre à gérer le jeton côté client, en utilisant Angular, afin de le renvoyer à chaque demande
https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
la source
express-jwt
authentification, mais en lisant la documentation d'autres paquets tels quepassport-jwt
, je pense que je vais m'en tenirexpress-jwt
. Beaucoup plus simple, beaucoup plus agréable IMOVoici un passe-partout sur lequel je travaille pour utiliser spécifiquement des jetons api uniquement (pas de session ... pas cette session n'est pas bonne bien sûr; nous utilisons simplement une approche par jeton): https://github.com/roblevintennis/passport -api-jetons
la source