Aller au contenu

jwt : Module JWT pour NGINX

Installation

Vous pouvez installer ce module sur toute distribution basée sur RHEL, y compris, mais sans s'y limiter :

  • RedHat Enterprise Linux 7, 8, 9 et 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 et Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-jwt
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-jwt

Activez le module en ajoutant la ligne suivante en haut de /etc/nginx/nginx.conf :

load_module modules/ngx_http_auth_jwt_module.so;

Ce document décrit nginx-module-jwt v3.4.6 publié le 01 août 2026.


Module d'authentification JWT pour Nginx

License

Il s'agit d'un module NGINX permettant de vérifier la validité d'un JWT. Ce module se veut aussi léger que possible et simple :

Démarrage rapide :

Image Docker :

L'image est générée avec Github Actions (voir nginx-jwt-module:latest)

docker pull ghcr.io/max-lt/nginx-jwt-module:latest

Une variante plus légère basée sur nginx:alpine-slim (sans les modules dynamiques nginx supplémentaires tels que njs, image-filter, xslt ou geoip) est également disponible :

docker pull ghcr.io/max-lt/nginx-jwt-module:latest-slim

Paquets pré-compilés (Ubuntu / Debian)

Des paquets pré-compilés pour ce module sont disponibles gratuitement dans le dépôt GetPageSpeed :

# Ajouter le dépôt (exemple Ubuntu - remplacez 'ubuntu' et 'jammy' selon votre distribution)
echo "deb [signed-by=/etc/apt/keyrings/getpagespeed.gpg] https://extras.getpagespeed.com/ubuntu jammy main" \
  | sudo tee /etc/apt/sources.list.d/getpagespeed-extras.list

# nginx.conf
load_module /usr/lib/nginx/modules/ngx_http_auth_jwt_module.so;

http {
    server {
        auth_jwt_key "0123456789abcdef" hex; # Votre clé sous forme de chaîne hexadécimale
        auth_jwt     off;

        # La méthode d'authentification par défaut est l'en-tête "Authentication"
        location /secured-by-auth-header/ {
            auth_jwt on;
        }

        # Mais vous pouvez utiliser un cookie à la place
        location /secured-by-cookie/ {
            auth_jwt $cookie_MyCookieName;
        }

        # Les clés JWT sont héritées du niveau de configuration précédent
        # mais vous pouvez avoir des clés différentes pour différents emplacements
        location /secured-by-auth-header-too/ {
            auth_jwt_key "another-secret"; # Votre clé sous forme de chaîne utf8
            auth_jwt on;
        }

        location /secured-by-rsa-key/ {
            auth_jwt_key /etc/keys/rsa-public.pem file; # Votre clé depuis un fichier PEM
            auth_jwt on;
        }

        location /not-secure/ {}
    }
}

Remarque : n'oubliez pas de charger le module dans le contexte principal :

load_module /usr/lib/nginx/modules/ngx_http_auth_jwt_module.so;

Directives :

auth_jwt

Syntaxe : auth_jwt $variable | on | off;
Défaut : auth_jwt off;
Contexte : http, server, location

Active la validation du JWT.

La valeur auth_jwt $variable peut être utilisée pour définir une méthode personnalisée d'obtention du JWT, par exemple pour le récupérer depuis un cookie au lieu de l'en-tête Authentication par défaut : auth_jwt $cookie_MyCookieName;


auth_jwt_key

Syntaxe : auth_jwt_key value [encoding];
Défaut : ——
Contexte : http, server, location

Spécifie la clé pour valider la signature JWT (doit être hexadécimale).
L'option encoding peut être hex | utf8 | base64 | file (la valeur par défaut est utf8).
L'option file nécessite que la value soit un chemin de fichier valide (pointant vers une clé encodée en PEM).


auth_jwt_alg

Syntaxe : auth_jwt_alg any | HS256 | HS384 | HS512 | RS256 | RS384 | RS512 | ES256 | ES384 | ES512;
Défaut : auth_jwt_alg any;
Contexte : http, server, location

Spécifie l'algorithme que le serveur s'attend à recevoir dans le JWT.

Les jetons signés avec un algorithme HMAC (HS256, HS384, HS512) sont toujours rejetés lorsque la clé est une clé PEM, quelle que soit la valeur de cette directive : une clé publique n'est pas un secret, donc n'importe qui pourrait sinon l'utiliser pour signer un jeton que le serveur accepterait. Il est néanmoins recommandé de fixer l'algorithme attendu.


auth_jwt_require

Syntaxe : auth_jwt_require $value ... [error=401 | 403];
Défaut : ——
Contexte : http, server, location

Spécifie des vérifications supplémentaires pour la validation JWT. L'authentification ne réussira que si toutes les valeurs ne sont pas vides et ne sont pas égales à « 0 ».

Ces directives sont héritées du niveau de configuration précédent si et seulement si aucune directive auth_jwt_require n'est définie au niveau actuel.

Si l'une des vérifications échoue, le code d'erreur 401 est renvoyé. Le paramètre optionnel error permet de redéfinir le code d'erreur à 403.

Exemple :

# server.conf

map $jwt_claim_role $jwt_has_admin_role {
    \"admin\"  1;
}

map $jwt_claim_scope $jwt_has_restricted_scope {
    \"restricted\"  1;
}

server {
  # ...

  location /auth-require {
    auth_jwt_require $jwt_has_admin_role error=403;
    # ...
  }

  location /auth-compound-require {
    auth_jwt_require $jwt_has_admin_role $jwt_has_restricted_scope error=403;
    # ...
  }
}

Notez que comme $jwt_claim_ renvoie une valeur encodée en JSON, nous devons vérifier \"value\" (et non value)

Variables intégrées :

Le module ngx_http_auth_jwt_module prend en charge les variables intégrées :

  • $jwtheadername renvoie la valeur d'en-tête spécifiée
  • $jwtclaimname renvoie la valeur de revendication spécifiée
  • $jwt_headers renvoie les en-têtes
  • $jwt_payload renvoie la charge utile

Notez que comme toutes les valeurs renvoyées sont encodées en JSON, les chaînes seront entourées du caractère "

Étendre votre image Docker :

Créez simplement votre image à partir de celle générée par Github

FROM ghcr.io/max-lt/nginx-jwt-module:latest

# Copiez votre configuration nginx
# N'oubliez pas d'inclure ce module dans votre configuration
# load_module /usr/lib/nginx/modules/ngx_http_auth_jwt_module.so;
COPY my-nginx-conf /etc/nginx

EXPOSE 8000

STOPSIGNAL SIGTERM

CMD ["nginx", "-g", "daemon off;"]

Ou utilisez directement celle fournie

docker run -p 80:80 \
  -v ./nginx.conf:/etc/nginx/nginx.conf \
  ghcr.io/max-lt/nginx-jwt-module

ou

docker build -f Dockerfile -t jwt-nginx .

### Test :

#### Utilisation par défaut :

```bash
make test # Construira une image de test et exécutera la suite de tests

Exemples de configurations :

Dans cette section, nous verrons quelques exemples d'utilisation de ce module.

Redirection vers la page de connexion si le JWT est invalide :

load_module /usr/lib/nginx/modules/ngx_http_auth_jwt_module.so;

# ...

http {
    server {
        listen 80;
        server_name _;

        auth_jwt_key "0123456789abcdef" hex; # Votre clé sous forme de chaîne hexadécimale
        auth_jwt     off;

        location @login_err_redirect {
            return 302 $scheme://$host:$server_port/login?redirect=$request_uri;
        }

        location /secure/ {
            auth_jwt on;
            error_page 401 = @login_err_redirect;
        }

        location / {
            return 200 "OK";
        }
    }
}

Essayer curl -i http://localhost/secure/path?param=value renverra une redirection 302 vers /login?redirect=/secure/path?param=value si le JWT est invalide.

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-jwt.