J'ai l'authentification qui fonctionne avec passport JWT, mais j'ai du mal à exécuter une fonction de rappel/réponse, seulement si un utilisateur est authentifié. Comment cela peut-il être fait ?
Dans mes routes :
import express depuis 'express';
import passport depuis '../../config/passport';
import memberInfoCtrl depuis '../controllers/memberInfo';
const router = express.Router();
router.route('/membres')
.get(membersCtrl.tokenCheck, passport.authenticate('jwt', { session: false }), membersCtrl.doSomethingElse);
export default router;
Je veux que membersCtrl.doSomethingElse
soit exécuté si l'authentification est réussie.
Voici ma fonction tokenCheck :
function tokenCheck(req, res, next) {
const token = getToken(req.headers);
if (token) {
const decoded = jwt.decode(token, config.secret);
User.findOne({
email: decoded.email
}, (err, user) => {
if (err) throw err;
if (!user) {
return res.status(403).send({
success: false, msg: 'Authentification échouée. Utilisateur non trouvé.'
});
}
// res.json({ success: true, msg: 'Bienvenue dans la zone réservée aux membres !' });
return next();
});
} else {
return res.status(403).send({ success: false, msg: 'Aucun jeton fourni.' });
}
}
Utiliser res.json
dans tokenCheck
fonctionne bien, mais la fonction doSomethingElse
n'est pas appelée par la suite.
Je pensais que c'était parce que nous renvoyer une réponse de cette manière :
res.json({ success: true, msg: 'Bienvenue dans la zone réservée aux membres !' });
Remplacer le res.json
par return next();
renvoie l'erreur :
Erreur: Stratégie d'authentification inconnue "jwt"
Pourquoi cela se produit-il - comment puis-je vérifier l'authentification avant d'exécuter une autre fonction, pour la même route ?
Je suis sûr que c'est quelque chose de stupide que j'ai oublié. Toute aide est appréciée !
Voici une partie de mon script express principal qui initialise passport :
import passport depuis 'passport';
...
app.use(passport.initialize());
app.use('/api', routes);
...
Configuration de Passport :
const JwtStrategy = require('passport-jwt').Strategy;
import User depuis '../server/models/user';
import config depuis './env';
module.exports = (passport) => {
const opts = {};
opts.secretOrKey = config.secret;
passport.use(new JwtStrategy(opts, (jwtPayload, done) => {
User.findOne({ id: jwtPayload.id }, (err, user) => {
if (err) {
return done(err, false);
}
if (user) {
done(null, user);
} else {
done(null, false);
}
});
}));
};