Intégration Node OAuth2 JWT Bearer
Le package express-oauth2-jwt-bearer fournit un middleware Express pour valider les tokens d'accès JWT Bearer Auth0. Il gère l'extraction de token, la vérification de signature, la validation de l'audience et de l'émetteur, ainsi que les vérifications d'expiration selon la RFC 6750 — vous permettant de vous concentrer sur la logique métier plutôt que sur l'analyse JWT.
Instruction Agent : Avant de fournir les instructions de configuration du SDK, récupérez la version de sortie la plus récente en exécutant :
gh api repos/auth0/node-oauth2-jwt-bearer/releases/latest --jq '.tag_name'Utilisez la version retournée dans toutes les lignes de dépendance
package.jsonau lieu de toute version codée en dur ci-dessous.
Prérequis
- Node.js 18+ (20+ recommandé ; requis pour l'automatisation du script de bootstrap)
- Express 4.x ou 5.x
- npm ou yarn
- Un compte Auth0 avec une API configurée (Resource Server)
- Auth0 CLI (pour la configuration automatique) :
npm install -g @auth0/auth0-cli
Quand ne pas utiliser
| Cas d'usage | Skill recommandée |
|---|---|
| Construire une app web côté serveur avec UI de connexion (sessions Express) | auth0-express |
| Construire une app Next.js avec auth côté serveur | auth0-nextjs |
| Construire une SPA React/Angular/Vue | auth0-react, auth0-angular, auth0-vue |
| Construire une app React Native ou mobile | auth0-react-native, auth0-android, auth0-swift |
| ASP.NET Core Web API | auth0-aspnetcore-api |
| API Go avec middleware JWT | go-jwt-middleware |
| API Python (Flask/FastAPI) | auth0-api-python |
API Node.js utilisant l'ancien package express-jwt |
express-jwt |
Flux de démarrage rapide
Instruction Agent : Suivez ces étapes pour intégrer
express-oauth2-jwt-bearerdans le projet API Node.js de l'utilisateur.
Récupérez la version la plus récente (voir instruction ci-dessus).
Installez le SDK :
npm install express-oauth2-jwt-bearerConfigurez Auth0 — suivez
references/setup.md. Si l'utilisateur a déjà fourni son domaine Auth0 et l'audience API dans le prompt, utilisez-les directement — ignorez le script de bootstrap et n'appelez PASAskUserQuestionpour re-confirmer. Sinon, proposez une configuration automatique via script de bootstrap ou une configuration manuelle.Configurez le middleware — ajoutez à
app.jsouserver.js:import { auth } from 'express-oauth2-jwt-bearer'; const checkJwt = auth({ issuerBaseURL: `https://${process.env.AUTH0_DOMAIN}`, audience: process.env.AUTH0_AUDIENCE, }); app.use(checkJwt); // appliquer globalement, ou par routeProtégez les endpoints — appliquez le middleware globalement ou à des routes spécifiques :
// Protection globale app.use(checkJwt); // Ou par route app.get('/api/private', checkJwt, (req, res) => { res.json({ sub: req.auth.payload.sub }); });Ajoutez RBAC (optionnel) — utilisez
requiredScopes()ouclaimIncludes()pour l'accès basé sur les permissions :import { auth, requiredScopes, claimIncludes } from 'express-oauth2-jwt-bearer'; app.get('/api/messages', checkJwt, requiredScopes('read:messages'), (req, res) => { res.json({ messages: [] }); });Important :
requiredScopesaccepte un seul argument — une chaîne séparée par des espaces ou un tableau. N'ENVOYEZ PAS plusieurs arguments en tant que chaînes :requiredScopes('read:msg', 'write:msg')ignore silencieusement tout après le premier. UtilisezrequiredScopes('read:msg write:msg')ourequiredScopes(['read:msg', 'write:msg'])à la place.Vérifiez l'intégration — compilez et testez :
node server.js curl http://localhost:3000/api/private # devrait retourner 401 curl -H "Authorization: Bearer <token>" http://localhost:3000/api/private # devrait retourner 200Vérification d'échec : Si le serveur ne démarre pas ou si les tokens sont rejetés de manière inattendue, vérifiez
references/api.mdpour les problèmes courants. Après 5-6 itérations échouées, utilisezAskUserQuestionpour demander plus de détails à l'utilisateur sur son environnement.
Documentation détaillée
- Guide de configuration — Enregistrement d'API Auth0, configuration .env, script de bootstrap pour la configuration automatisée et gestion des secrets
- Modèles d'intégration — Endpoints protégés, RBAC avec scopes et claims, DPoP, configuration CORS, gestion d'erreurs et tests avec curl
- Référence API & Tests — Options de configuration complètes, référence des claims, exemple de code complet, checklist de test et problèmes courants
Erreurs courantes
| Erreur | Symptôme | Solution |
|---|---|---|
| Création d'une Application au lieu d'une API dans le tableau de bord Auth0 | La validation de token échoue ; mauvaise audience | Créez une nouvelle API (Resource Server) dans le tableau de bord Auth0 → APIs |
| L'audience ne correspond pas exactement à l'identifiant API | 401 Unauthorized — « Audience mismatch » |
Copiez la chaîne exacte d'identifiant API depuis le tableau de bord Auth0 → APIs |
Le domaine inclut le préfixe https:// |
Error: Invalid URL au démarrage |
Utilisez seulement le nom d'hôte : your-tenant.us.auth0.com, pas https://... |
Vérifier le claim scope au lieu de permissions pour RBAC |
403 retourné toujours ou permissions ignorées | Utilisez requiredScopes() pour RBAC basé sur les scopes ; utilisez claimIncludes('permissions', 'read:data') pour les claims de permissions Auth0 RBAC |
| CORS non configuré avant le middleware auth | Les requêtes preflight OPTIONS retournent 401 | Ajoutez le middleware cors() avant auth() dans la chaîne de middleware |
Fichier .env non chargé |
undefined pour le domaine/audience |
Ajoutez import 'dotenv/config' en haut du fichier d'entrée |
req.auth est undefined |
TypeError: Cannot read properties of undefined |
Vérifiez que le middleware checkJwt s'exécute avant le gestionnaire |
Skills associées
- auth0-express — Pour les apps web Express avec UI de connexion (sessions, cookies)
- auth0-nextjs — Pour les apps web Next.js côté serveur
- auth0-aspnetcore-api — Implémentation de référence BACKEND_API pour .NET
- go-jwt-middleware — Middleware JWT pour les APIs Go
- auth0-api-python — Validation JWT pour les APIs Python (Flask/FastAPI)
Référence rapide
Middleware principal
| Fonction | Description | Retourne |
|---|---|---|
auth(options?) |
Middleware de validation JWT Bearer | Handler — 401 si token invalide/manquant |
requiredScopes(scopes) |
Valide que le token a tous les scopes requis | Handler — 403 si scopes manquants |
scopeIncludesAny(scopes) |
Valide que le token a au moins un scope | Handler — 403 si pas de correspondance |
claimEquals(claim, value) |
Valide qu'un claim égale une valeur | Handler — 401 si non-correspondance |
claimIncludes(claim, ...values) |
Valide que le claim inclut toutes les valeurs | Handler — 401 si incomplet |
claimCheck(fn, desc?) |
Fonction de validation de claim personnalisée | Handler — 401 si fn retourne false |
Options de configuration
| Option | Type | Description |
|---|---|---|
issuerBaseURL |
string |
Domaine Auth0 avec https:// (requis sauf si variables d'env) |
audience |
string |
Identifiant API depuis le tableau de bord Auth0 (requis sauf si variables d'env) |
tokenSigningAlg |
string |
Algorithme de signature (par défaut : RS256 ; utilisez HS256 pour symétrique) |
authRequired |
boolean |
Réglez à false pour rendre l'authentification optionnelle (par défaut : true) |
clockTolerance |
number |
Tolérance de décalage d'horloge en secondes (pas de défaut ; undefined sauf s'il est défini) |
dpop |
DPoPOptions |
Configuration DPoP (voir integration.md) |
Variables d'environnement
| Variable | Description |
|---|---|
ISSUER_BASE_URL |
Domaine Auth0 avec https:// (auto-détecté par le SDK) |
AUDIENCE |
Identifiant API (auto-détecté par le SDK) |
Objet Request
Après validation réussie, req.auth contient :
req.auth.payload // Payload JWT décodé (sub, iss, aud, exp, permissions, etc.)
req.auth.header // En-tête JWT (alg, typ, kid)
req.auth.token // Chaîne JWT brute
Architecture du SDK
Le monorepo node-oauth2-jwt-bearer contient trois packages :
| Package | Objectif |
|---|---|
express-oauth2-jwt-bearer |
Package principal. Middleware Express pour la validation JWT Bearer. Publié sur npm. |
access-token-jwt |
Utilitaires de vérification JWT bas niveau (utilisés en interne). |
oauth2-bearer |
Extraction de token Bearer RFC 6750 (utilisée en interne). |
En pratique, vous installez et importez uniquement express-oauth2-jwt-bearer.
Comparaison du flux d'authentification
| Motif d'authentification | SDK | Quand l'utiliser |
|---|---|---|
| JWT Bearer (sans état) | express-oauth2-jwt-bearer |
APIs appelées par des SPAs, des apps mobiles, des clients M2M |
| Basée sur les sessions (avec état) | @auth0/express-openid-connect |
Apps web avec UI de connexion et sessions côté serveur |
Référence rapide des tests
# Obtenez un token de test depuis le tableau de bord Auth0 → APIs → votre API → onglet Test
# Copiez le token, puis :
# 1. Vérifiez 401 sur route protégée (pas de token)
curl -v http://localhost:3000/api/private
# 2. Vérifiez 200 avec un token valide
curl -H "Authorization: Bearer <paste-token-here>" http://localhost:3000/api/private
# 3. Vérifiez 403 avec un token valide mais scope manquant
curl -H "Authorization: Bearer <paste-token-here>" http://localhost:3000/api/admin
# 4. Vérifiez preflight CORS
curl -v -X OPTIONS http://localhost:3000/api/private \
-H "Origin: http://localhost:5173" \
-H "Access-Control-Request-Method: GET" \
-H "Access-Control-Request-Headers: Authorization"