jwt: Módulo JWT para NGINX
Instalación
Puede instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero sin limitarse a:
- RedHat Enterprise Linux 7, 8, 9 y 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 y 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
Habilite el módulo añadiendo lo siguiente al principio de /etc/nginx/nginx.conf:
load_module modules/ngx_http_auth_jwt_module.so;
Este documento describe nginx-module-jwt v3.4.6 publicado el 01 de agosto de 2026.
Módulo de autenticación JWT para Nginx
Este es un módulo de NGINX para verificar un JWT válido. Este módulo pretende ser lo más ligero posible y mantener la simplicidad:
- Imagen Docker basada en el Dockerfile oficial de nginx (alpine).
- Imagen ligera (~400KB más que la oficial).
Inicio rápido:
Imagen Docker:
La imagen se genera con Github Actions (ver nginx-jwt-module:latest)
docker pull ghcr.io/max-lt/nginx-jwt-module:latest
También está disponible una variante más ligera basada en nginx:alpine-slim (sin los módulos dinámicos adicionales de nginx como njs, image-filter, xslt o geoip):
docker pull ghcr.io/max-lt/nginx-jwt-module:latest-slim
Paquetes precompilados (Ubuntu / Debian)
Los paquetes precompilados para este módulo están disponibles gratuitamente en el repositorio de GetPageSpeed:
# Añadir el repositorio (ejemplo para Ubuntu - reemplace 'ubuntu' y 'jammy' según su distribución)
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; # Su clave como cadena hexadecimal
auth_jwt off;
# El método de autenticación predeterminado es el encabezado "Authentication"
location /secured-by-auth-header/ {
auth_jwt on;
}
# Pero puede usar una cookie en su lugar
location /secured-by-cookie/ {
auth_jwt $cookie_MyCookieName;
}
# Las claves JWT se heredan del nivel de configuración anterior
# pero puede tener diferentes claves para diferentes ubicaciones
location /secured-by-auth-header-too/ {
auth_jwt_key "another-secret"; # Su clave como cadena utf8
auth_jwt on;
}
location /secured-by-rsa-key/ {
auth_jwt_key /etc/keys/rsa-public.pem file; # Su clave desde un archivo PEM
auth_jwt on;
}
location /not-secure/ {}
}
}
Nota: no olvide cargar el módulo en el contexto principal:
load_module /usr/lib/nginx/modules/ngx_http_auth_jwt_module.so;
Directivas:
auth_jwt
Sintaxis: auth_jwt $variable | on | off;
Predeterminado: auth_jwt off;
Contexto: http, server, location
Habilita la validación de JWT.
El valor auth_jwt $variable se puede usar para establecer una forma personalizada de obtener el JWT, por ejemplo, para obtenerlo de una cookie en lugar del encabezado Authentication predeterminado: auth_jwt $cookie_MyCookieName;
auth_jwt_key
Sintaxis: auth_jwt_key valor [codificación];
Predeterminado: ——
Contexto: http, server, location
Especifica la clave para validar la firma JWT (debe ser hexadecimal).
La opción codificación puede ser hex | utf8 | base64 | file (el valor predeterminado es utf8).
La opción file requiere que el valor sea una ruta de archivo válida (que apunte a una clave codificada en PEM).
auth_jwt_alg
Sintaxis: auth_jwt_alg any | HS256 | HS384 | HS512 | RS256 | RS384 | RS512 | ES256 | ES384 | ES512;
Predeterminado: auth_jwt_alg any;
Contexto: http, server, location
Especifica qué algoritmo espera el servidor recibir en el JWT.
Los tokens firmados con un algoritmo HMAC (HS256, HS384, HS512) siempre se rechazan cuando la clave es una clave PEM,
independientemente de lo que establezca esta directiva: una clave pública no es un secreto, por lo que cualquiera podría usarla para
firmar un token que el servidor aceptaría. Se recomienda fijar el algoritmo esperado.
auth_jwt_require
Sintaxis: auth_jwt_require $valor ... [error=401 | 403];
Predeterminado: ——
Contexto: http, server, location
Especifica comprobaciones adicionales para la validación de JWT. La autenticación solo tendrá éxito si todos los valores no están vacíos y no son iguales a "0".
Estas directivas se heredan del nivel de configuración anterior si y solo si no hay directivas auth_jwt_require definidas en el nivel actual.
Si alguna de las comprobaciones falla, se devuelve el código de error 401. El parámetro opcional error permite redefinir el código de error a 403.
Ejemplo:
# 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;
# ...
}
}
Tenga en cuenta que como
$jwt_claim_devuelve un valor codificado en JSON, debemos comprobar\"value\"(y novalue)
Variables integradas:
El módulo ngx_http_auth_jwt_module admite variables integradas:
- $jwtheadernombre devuelve el valor del encabezado especificado
- $jwtclaimnombre devuelve el valor del claim especificado
- $jwt_headers devuelve los encabezados
- $jwt_payload devuelve el payload
Tenga en cuenta que como todos los valores devueltos están codificados en JSON, las cadenas estarán rodeadas por el carácter
"
Amplíe su imagen Docker:
Simplemente cree su imagen a partir de la generada por Github
FROM ghcr.io/max-lt/nginx-jwt-module:latest
# Copie su configuración de nginx
# No olvide incluir este módulo en su configuración
# 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;"]
O use la proporcionada directamente
docker run -p 80:80 \
-v ./nginx.conf:/etc/nginx/nginx.conf \
ghcr.io/max-lt/nginx-jwt-module
o
docker build -f Dockerfile -t jwt-nginx .
### Pruebas:
#### Uso predeterminado:
```bash
make test # Creará una imagen de prueba y ejecutará el conjunto de pruebas
Ejemplos de configuración:
En esta sección veremos algunos ejemplos de cómo usar este módulo.
Redirigir a la página de inicio de sesión si el JWT no es válido:
load_module /usr/lib/nginx/modules/ngx_http_auth_jwt_module.so;
# ...
http {
server {
listen 80;
server_name _;
auth_jwt_key "0123456789abcdef" hex; # Su clave como cadena hexadecimal
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";
}
}
}
Al ejecutar curl -i http://localhost/secure/path?param=value se devolverá una redirección 302 a /login?redirect=/secure/path?param=value si el JWT no es válido.
GitHub
Puede encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-jwt.