404
Not Found
Not Found
Dans Express.js, un token est une preuve d’identité permettant d’autoriser un utilisateur ou un service à accéder à des ressources protégées.
Le serveur émet un token après authentification, puis le client l’envoie à chaque requête (souvent dans le header Authorization).
Les tokens remplacent les sessions classiques (cookies de session) dans les architectures modernes d’API REST ou microservices.
Un JWT est un jeton auto-contenu, signé par le serveur, qui contient des informations encodées (sub, email, role, etc.).
Bibliothèques modernes :
jose (recommandée, moderne, conforme RFC)jsonwebtoken (ancienne)Structure d’un JWT :
header.payload.signature
Avantages :
Inconvénients :
localStorage.Cette approche utilise deux jetons :
L’Access Token est stocké en mémoire, le Refresh Token en cookie HttpOnly + Secure.
Cela permet un renouvellement transparent de session sans redemander le mot de passe.
Un JWT peut être stocké directement dans un cookie HttpOnly et Secure, qui remplace la session traditionnelle.
OpenID Connect (OIDC) et OAuth2 sont utilisés pour :
Libs utiles :
Le token opaque est un identifiant aléatoire sans signification :
3baf4d90-e95c-46f7-bb1f-3d27a36c6e52
Il ne contient aucune donnée utilisateur.
Le serveur stocke l’association dans Redis :
SET token:3baf4d90 { "userId": 42, "role": "admin" } EX 900
À chaque requête, le serveur consulte Redis pour vérifier la validité du token.
Avantages :
Inconvénients :
| Critère | JWT | Token Opaque + Redis |
|---|---|---|
| Structure | Auto-contenu | Identifiant aléatoire |
| Stockage | Côté client | Côté serveur |
| Vérification | Locale (signature) | Consultation Redis |
| Révocation | Complexe | Instantanée |
| Sécurité | Bonne | Très élevée |
| Scalabilité | Excellente | Bonne mais centralisée |
| Débogage | Facile (lisible) | Requiert Redis |
| Usage typique | API publiques, microservices | API internes, sécurité stricte |
Une API stateless ne garde aucun état entre les requêtes. Chaque requête contient toutes les informations nécessaires à son traitement.
Exemple :
Un JWT est stateless : il contient toutes les infos (id, rôle, expiration).
Aucun appel externe n’est nécessaire.
Une API stateful conserve l’état côté serveur (ex : Redis, sessions).
Les requêtes dépendent d’informations mémorisées sur le serveur.
Exemple : Un token opaque nécessite de consulter Redis pour savoir à quel utilisateur il correspond.
Conséquence :
Redis est une base clé/valeur en mémoire ultra-rapide, utilisée pour :
Redis stocke les données directement dans la RAM, ce qui le rend des dizaines de fois plus rapide que les bases de données classiques.
npm install redis
Exemple simple :
const { createClient } = require("redis");
const client = createClient();
client.connect();
app.get("/", async (req, res) => {
const count = await client.incr("visits");
res.send(`Visites : ${count}`);
});
| Risque | Mesure recommandée |
|---|---|
| Token volé | Durée courte + refresh token |
| Vol cookie | HttpOnly + Secure + SameSite=Strict |
| Secret exposé | Stocker la clé dans .env |
| Token forgé | Signature HMAC ou RSA |
| Révocation | Gérer une denylist ou Redis |
| Environnement HTTP | Toujours utiliser HTTPS |
| Vérification | Toujours vérifier signature et expiration |
import { SignJWT, jwtVerify } from "jose";
const secret = new TextEncoder().encode(process.env.JWT_SECRET);
export async function signToken(payload, expiresIn = "15m") {
return await new SignJWT(payload)
.setProtectedHeader({ alg: "HS256" })
.setIssuedAt()
.setExpirationTime(expiresIn)
.sign(secret);
}
export async function verifyToken(token) {
const { payload } = await jwtVerify(token, secret);
return payload;
}
router.post("/login", async (req, res) => {
const accessToken = await signToken({ sub: user.id }, "15m");
const refreshToken = await signToken({ sub: user.id, type: "refresh" }, "7d");
res.cookie("refresh_token", refreshToken, {
httpOnly: true,
secure: true,
sameSite: "Strict",
maxAge: 7 * 24 * 60 * 60 * 1000,
});
res.json({ accessToken });
});
const { v4: uuidv4 } = require("uuid");
const redis = require("../utils/redis");
exports.login = (req, res) => {
User.findOne({ email: req.body.email })
.then((user) => {
if (!user) return res.status(401).json({ error: "Utilisateur introuvable" });
const token = uuidv4();
redis.set(token, JSON.stringify({ id: user._id }), { EX: 900 });
res.json({ token });
})
.catch((err) => res.status(500).json({ error: "Erreur serveur" }));
};
Fin du document.
Commencez à écrire votre propre contenu ou modifiez celui-ci pour l’adapter à vos besoins. Pour créer, modifier ou supprimer du contenu, vous devez vous connecter au panneau d’administration avec le nom d’utilisateur admin et le mot de passe que vous avez défini lors du processus d'installation.
Mettez à jour les paramètres de votre site à partir du panneau d’administration, vous pouvez modifier le titre, la description et les réseaux sociaux dans les Paramètres généraux.
Restez informé sur l’actualité, les nouvelles versions, les nouveaux thèmes ou les nouveaux plugins sur nos réseaux sociaux Facebook, Twitter et YouTube ou visitez notre Blog.