express-oauth2-jwt-bearer

À utiliser pour ajouter la validation de tokens Auth0 à des APIs Express ou Node.js — intègre le SDK express-oauth2-jwt-bearer pour protéger les endpoints d'API Node.js avec l'authentification JWT Bearer, le RBAC basé sur les scopes, la validation des claims et la prise en charge optionnelle de DPoP

npx skills add https://github.com/auth0/agent-skills --skill express-oauth2-jwt-bearer

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.json au 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-bearer dans le projet API Node.js de l'utilisateur.

  1. Récupérez la version la plus récente (voir instruction ci-dessus).

  2. Installez le SDK :

    npm install express-oauth2-jwt-bearer
  3. Configurez 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 PAS AskUserQuestion pour re-confirmer. Sinon, proposez une configuration automatique via script de bootstrap ou une configuration manuelle.

  4. Configurez le middleware — ajoutez à app.js ou server.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 route
  5. Proté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 });
    });
  6. Ajoutez RBAC (optionnel) — utilisez requiredScopes() ou claimIncludes() 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 : requiredScopes accepte 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. Utilisez requiredScopes('read:msg write:msg') ou requiredScopes(['read:msg', 'write:msg']) à la place.

  7. 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 200
  8. Vé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.md pour les problèmes courants. Après 5-6 itérations échouées, utilisez AskUserQuestion pour 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

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"

Références

Skills similaires