Les instructions suivantes indiquent les modifications à apporter au Prototype de niveau 3 pour atteindre le Prototype de niveau 4.
$ npm install --save jsonwebtoken passport-http-bearer
Après le processus d’authentification OAuth2, l’application devra transmettre à l’utilisateur un jeton au format JWT. Pour cela, nous modifions le fichier /routes/signin.js de notre prototype :
// Import JWT module
const jwt = require('jsonwebtoken');
...
app.get('/signin/github/callback',
passport.authenticate('github', {session: false}),
// Issue JSON Web Token
function(req, res) {
// define the token payload
let payload = {id: req.user.id, username: req.user.username}
// sign the token
let token = jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: '1h', algorithm: 'HS512'});
// send the token
res.send("Your token is: " + token);
}
);
Après authentification, le prototype créera un jeton au format JWT que l’utilisateur devra utiliser dans chaque requête.
Dans le prototype proposé, les jetons sont signés avec un algorithme de signature symétrique (HMAC SHA 512). Si votre application doit contrôler des JWT émis par un serveur d’autorisation tiers, il faudra utiliser une signature asymétrique (exemple : ES256).
Nous allons configurer une seconde stratégie pour prendre en compte les jetons JWT dans le fichier config/MyPassport.js. L’utilisateur devra transmettre ce jeton dans chacune de ses requêtes dans l’entête HTTP “Authorization”.
// Import HTTP Bearer Strategy for Passport
MyBearerStrategy = require('passport-http-bearer').Strategy;
// Import JWT module
const jwt = require('jsonwebtoken');
// Configure the new HTTP Bearer Strategy for Passport
MyPassport.use(new MyBearerStrategy(
function (token, done) {
// Check JWT
jwt.verify(token, process.env.JWT_SECRET, function(err, payload) {
// If checking failed
if (err) {
return done(err)
};
// If user is empty
if (!payload){
return done(null, false);
}
// If everything all right, the user will be authenticated
return done(null, payload);
});
}));
La fonction de vérification permet d’effectuer les contrôles nécessaires sur le jeton : la signature doit être valide et la date d’expiration ne doit pas être dépassée.
Nous devons maintenant modifier la configuration (fichier app.js) des routes privées pour prendre en compte l’authentification par jeton :
const PrivateRouter = require('./routes/private.js');
app.use('/private', MyPassport.authenticate('bearer', {session: false}), PrivateRouter);
Pour tester cette route, il faudra récupérer votre jeton obtenu après authentification (signin/github) puis exécuter la commande suivante en remplaçant TOKEN par la valeur de votre jeton :
curl -i http://localhost:3000/private/greeting -H "Authorization: Bearer TOKEN"