Jetons JWT en JavaScript (Node.js)
\n\nJSON Web Token (JWT) est un standard ouvert (RFC 7519) pour la création de jetons d'accès basés sur JSON. JWT est largement utilisé pour l'authentification et l'échange d'informations entre le client et le serveur dans les applications web modernes sur Node.js. Dans cet article, nous allons voir comment travailler avec JWT dans l'environnement Node.js en utilisant la bibliothèque populaire jsonwebtoken.
Qu'est-ce que JWT ?
\n\nJWT se compose de trois parties séparées par des points :
\n\n- \n
- Header — l'en-tête contenant le type de jeton et l'algorithme de signature (par exemple, HS256 ou RS256). \n
- Payload — la charge utile, qui stocke les données (claims) : identifiant utilisateur, rôle, durée de vie du jeton, etc. \n
- Signature — la signature créée à partir du header, du payload et de la clé secrète. La signature garantit que le jeton n'a pas été modifié. \n
Visuellement, un JWT ressemble à ceci : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Installation de la bibliothèque jsonwebtoken
\n\nPour travailler avec JWT dans Node.js, on utilise le paquet jsonwebtoken. Installez-le via npm :
npm install jsonwebtoken\n\nAprès l'installation, vous pouvez importer la bibliothèque dans votre projet :
\n\nconst jwt = require('jsonwebtoken');\n\nGénération (signature) d'un jeton JWT
\n\nPour créer un jeton, utilisez la méthode jwt.sign(). Elle prend trois paramètres principaux :
- \n
- payload — un objet avec les données à encoder dans le jeton. \n
- secretOrPrivateKey — la clé secrète (ou la clé privée pour les algorithmes RSA/ECDSA). \n
- options — un objet avec des options, par exemple
expiresInpour définir la durée de vie du jeton. \n
Exemple de génération d'un jeton :
\n\nconst jwt = require('jsonwebtoken');\n\nconst payload = {\n userId: 12345,\n role: 'user'\n};\n\nconst secretKey = 'your-secret-key-here';\n\nconst token = jwt.sign(payload, secretKey, { expiresIn: '1h' });\n\nconsole.log('Jeton généré :', token);\n\nDans cet exemple, le jeton sera valide pendant 1 heure. Vous pouvez également spécifier le temps en secondes (expiresIn: 3600) ou dans d'autres formats, par exemple '7d' (7 jours) ou '30m' (30 minutes).
Vérification d'un jeton JWT
\n\nPour vérifier l'authenticité du jeton, on utilise la méthode jwt.verify(). Elle retourne le payload décodé si le jeton est valide, ou lève une erreur si le jeton a expiré ou si la signature est incorrecte.
const jwt = require('jsonwebtoken');\n\nconst token = 'eyJhbGciOiJIUzI1NiIs...'; // votre jeton\nconst secretKey = 'your-secret-key-here';\n\ntry {\n const decoded = jwt.verify(token, secretKey);\n console.log('Données décodées :', decoded);\n} catch (err) {\n console.error('Erreur de vérification :', err.message);\n}\n\nSi le jeton a expiré, vous obtiendrez l'erreur 'jwt expired'. Si la signature est incorrecte — 'invalid signature'.
Décodage sans vérification de la signature
\n\nParfois, il est nécessaire de simplement lire les données du jeton sans vérifier la signature (par exemple, pour le débogage). Pour cela, utilisez jwt.decode() :
const jwt = require('jsonwebtoken');\n\nconst token = 'eyJhbGciOiJIUzI1NiIs...';\nconst decoded = jwt.decode(token);\n\nconsole.log('Payload sans vérification :', decoded);\n\nImportant : jwt.decode() ne vérifie pas la signature, ne l'utilisez donc pas pour l'authentification en production.
Middleware pour Express avec JWT
\n\nDans les applications web Express, JWT est souvent utilisé pour protéger les routes. Créons un middleware simple qui vérifie le jeton à partir de l'en-tête <