El plugin jwt-auth autentica y autoriza las solicitudes con base en JSON Web Tokens (JWT). Analiza un JWT desde parámetros de URL, encabezados de solicitud o cookies, y verifica el token para conceder o denegar el acceso. A diferencia de JWT authentication and authorization, este plugin también identifica a los llamantes, lo que le permite configurar credenciales JWT distintas para cada uno.
Campos de configuración
Configuración de autenticación
|
Nombre |
Tipo de dato |
Obligatorio |
Valor predeterminado |
Descripción |
|
consumers |
array of object |
Obligatorio |
- |
Los consumidores del servicio que se usan para la autenticación de solicitudes. |
|
global_auth |
Array of strings |
Opcional (solo para configuraciones a nivel de instancia) |
- |
Solo se configura a nivel de instancia. Si se establece en true, la autenticación se aplica de forma global. Si se establece en false, la autenticación solo se aplica a los nombres de dominio y rutas configurados. Si no se configura, la autenticación se aplica de forma global únicamente cuando no existen configuraciones de nombres de dominio ni de rutas, con el fin de mantener la compatibilidad con versiones anteriores. |
A continuación se describen los campos de cada elemento en consumers.
|
Nombre |
Tipo de dato |
Obligatorio |
Valor predeterminado |
Descripción |
|
name |
string |
Obligatorio |
- |
El nombre del consumidor. |
|
jwks |
string |
Opcional. Se requiere |
- |
Una cadena JSON Web Key Set (JWKS) según lo especificado en JSON Web Key (JWK), que contiene la clave pública o simétrica utilizada para verificar la firma del JWT. |
|
remote_jwks |
object |
Opcional. Elija |
{"uri":"http://127.0.0.1/keys","service":"test.static","port":"80","ttl":30000,"timeout":3000} |
Obtiene periódicamente el JWKS desde una URI de servicio específica. Si se configuran tanto Nota
El tamaño del JWKS devuelto por |
|
issuer |
string |
Opcional |
- |
El emisor del JWT. Debe coincidir con el campo |
|
claims |
object |
Opcional |
- |
Los pares clave-valor que corresponden a los pares clave-valor del payload. Sirven para comprobar que varios campos coinciden con el payload. Por ejemplo, si configura |
|
claims_to_headers |
array of object |
Opcional |
- |
Extrae campos específicos del payload del JWT y los establece como encabezados de solicitud antes de reenviarlos al backend. |
|
from_headers |
array of object |
Opcional |
[{"name":"Authorization","value_prefix":"Bearer"}] |
Extrae el JWT de los encabezados de solicitud especificados. |
|
from_params |
array of string |
Opcional |
access_token |
Extrae el JWT de los parámetros de URL especificados. |
|
from_cookies |
array of string |
Opcional |
- |
Extrae el JWT de las cookies especificadas. |
|
clock_skew_seconds |
number |
Opcional |
60 |
La desviación de reloj permitida, en segundos, al verificar los campos |
|
keep_token |
bool |
Opcional |
true |
Indica si se conserva el JWT al reenviar la solicitud al backend. |
Los valores predeterminados se utilizan únicamente cuando no se configuran from_headers, from_params ni from_cookies.
-
A continuación se describen los campos de cada elemento en
from_headers.Nombre
Tipo de dato
Obligatorio
Valor predeterminado
Descripción
name
string
Obligatorio
-
El encabezado de solicitud del cual se extrae el JWT.
value_prefix
string
Obligatorio
-
El prefijo que se elimina del valor del encabezado. La parte restante se trata como el JWT.
-
En esta tabla se detallan los campos de cada elemento en
claims_to_headers.Nombre
Tipo de dato
Obligatorio
Valor predeterminado
Descripción
claim
string
Obligatorio
-
Un campo específico del payload del JWT. El valor debe ser una cadena o un entero sin signo.
header
string
Obligatorio
-
El encabezado de solicitud que se llena con el valor del claim extraído y se reenvía al backend.
override
bool
Opcional
true
-
Si es true, sobrescribe el encabezado de solicitud cuando tiene el mismo nombre.
-
Si es false, agrega el valor como un encabezado de solicitud duplicado.
-
-
La siguiente tabla describe los campos de cada elemento en
remote_jwks.Nombre
Tipo de dato
Obligatorio
Valor predeterminado
Descripción
uri
string
Obligatorio
-
La URL de la solicitud.
service
string
Obligatorio
-
-
Ejemplo para un servicio de Kubernetes: foo.default.svc.cluster.local.
-
Ejemplo para un servicio de Nacos: foo.DEFAULT-GROUP.public.nacos.
-
Para un servicio DNS llamado test, introduzca test.dns.
-
Para un servicio de IP estática llamado test, introduzca test.static.
port
bool
Obligatorio
-
El puerto del servicio.
timeout
bool
Opcional
3000
El tiempo de espera de la solicitud al servicio, en milisegundos.
ttl
bool
Opcional
30000
La duración de la caché, en milisegundos.
-
Configuración de autorización (opcional)
|
Nombre |
Tipo de dato |
Obligatorio |
Valor predeterminado |
Descripción |
|
allow |
array of string |
Opcional (no aplica para configuraciones a nivel de instancia) |
- |
Solo se configura en reglas detalladas, como rutas o nombres de dominio. Especifica qué consumidores tienen permitido acceder al recurso coincidente. |
Las configuraciones de autorización y autenticación no pueden usarse en la misma regla.
En las solicitudes que superan la autenticación y la autorización, se añade el encabezado
X-Mse-Consumerpara identificar el nombre del llamante.
Ejemplos de configuración
Configurar la autenticación global y la autorización a nivel de ruta
Este ejemplo habilita la autenticación JWT global a nivel de instancia y restringe el acceso a nivel de ruta para consumidores específicos.
Si un JWT coincide con varios JWKS, se utiliza el primer consumidor coincidente según el orden de configuración.
Configuración del plugin
Configure el plugin a nivel de instancia de la siguiente manera:
consumers:
- name: consumer1
issuer: abcd
jwks: |
{
"keys": [
{
"kty": "oct",
"kid": "123",
"k": "hM0k3AbXBPpKOGg__Ql2Obcq7s60myWDpbHXzgKUQdYo7YCRp0gUqkCnbGSvZ2rGEl4YFkKqIqW7mTHdj-bcqXpNr-NOznEyMpVPOIlqG_NWVC3dydBgcsIZIdD-MR2AQceEaxriPA_VmiUCwfwL2Bhs6_i7eolXoY11EapLQtutz0BV6ZxQQ4dYUmct--7PLNb4BWJyQeWu0QfbIthnvhYllyl2dgeLTEJT58wzFz5HeNMNz8ohY5K0XaKAe5cepryqoXLhA-V-O1OjSG8lCNdKS09OY6O0fkyweKEtuDfien5tHHSsHXoAxYEHPFcSRL4bFPLZ0orTt1_4zpyfew",
"alg": "HS256"
}
]
}
- name: consumer2
issuer: abc
jwks: |
{
"keys": [
{
"kty": "RSA",
"e": "AQAB",
"use": "sig",
"kid": "123",
"alg": "RS256",
"n": "i0B67f1jggT9QJlZ_8QL9QQ56LfurrqDhpuu8BxtVcfxrYmaXaCtqTn7OfCuca7cGHdrJIjq99rz890NmYFZuvhaZ-LMt2iyiSb9LZJAeJmHf7ecguXS_-4x3hvbsrgUDi9tlg7xxbqGYcrco3anmalAFxsbswtu2PAXLtTnUo6aYwZsWA6ksq4FL3-anPNL5oZUgIp3HGyhhLTLdlQcC83jzxbguOim-0OEz-N4fniTYRivK7MlibHKrJfO3xa_6whBS07HW4Ydc37ZN3Rx9Ov3ZyV0idFblU519nUdqp_inXj1eEpynlxH60Ys_aTU2POGZh_25KXGdF_ZC_MSRw"
}
]
}
Configuración de rutas y nombres de dominio
Para las rutas route-a y route-b, configure el plugin de la siguiente manera:
allow:
- consumer1
Para los nombres de dominio *.example.com y test.com, configure el plugin de la siguiente manera:
allow:
- consumer2
En este ejemplo,
route-ayroute-bson los nombres de ruta introducidos al crear las rutas de la puerta de enlace. Cuando una solicitud coincide con estas rutas, se permite el acceso a los llamantes con el nombreconsumer1y se deniega al resto.Aquí,
*.example.comytest.comse usan para coincidir con el nombre de dominio de la solicitud. Cuando el nombre de dominio coincide, se permite el acceso a los llamantes con el nombreconsumer2y se deniega a los demás.
Ejemplos de solicitud
Con esta configuración, las siguientes solicitudes están permitidas. Estos ejemplos asumen que las solicitudes coinciden con la ruta route-a.
-
Establezca el JWT en un parámetro de URL.
curl 'http://xxx.hello.com/test?access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEy****.eyJpc3MiOiJhYmNkIiwic3ViIjoidGVzdCIsImlhdCI6MTY2NTY2MDUyNywiZXhwIjoxODY1NjczODE5fQ.-vBSV0bKeDwQcuS6eeSZN9dLTUnSnZVk8eVCXdooCQ4' -
Establezca el JWT en un encabezado de solicitud HTTP.
curl http://xxx.hello.com/test -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJpc3MiOiJhYmNkIiwic3ViIjoidGVzdCIsImlhdCI6MTY2NTY2MDUyNywiZXhwIjoxODY1NjczODE5fQ.-vBSV0bKeDwQcuS6eeSZN9dLTUnSnZVk8eVCXdooCQ4'
Compruebe el resultado
Tras una autenticación exitosa, se añade el encabezado X-Mse-Consumer a la solicitud con el nombre del llamante. En este ejemplo, su valor es consumer1.
Las siguientes solicitudes se denegarán.
La solicitud no proporciona un JWT, por lo que se devuelve un error 401.
El llamante asociado al JWT proporcionado no tiene permiso de acceso, por lo que se devuelve un error 403.
Habilitar a nivel de instancia de puerta de enlace pero deshabilitar para una ruta específica
Configure el plugin a nivel de instancia de la siguiente manera:
global_auth: true
consumers:
- name: consumer1
issuer: abcd
jwks: |
{
"keys": [
{
"kty": "oct",
"kid": "123",
"k": "hM0k3AbXBPpKOGg__Ql2Obcq7s60myWDpbHXzgKUQdYo7YCRp0gUqkCnbGSvZ2rGEl4YFkKqIqW7mTHdj-bcqXpNr-NOznEyMpVPOIlqG_NWVC3dydBgcsIZIdD-MR2AQceEaxriPA_VmiUCwfwL2Bhs6_i7eolXoY11EapLQtutz0BV6ZxQQ4dYUmct--7PLNb4BWJyQeWu0QfbIthnvhYllyl2dgeLTEJT58wzFz5HeNMNz8ohY5K0XaKAe5cepryqoXLhA-V-O1OjSG8lCNdKS09OY6O0fkyweKEtuDfien5tHHSsHXoAxYEHPFcSRL4bFPLZ0orTt1_4zpyfew",
"alg": "HS256"
}
]
}
- name: consumer2
issuer: abc
jwks: |
{
"keys": [
{
"kty": "RSA",
"e": "AQAB",
"use": "sig",
"kid": "123",
"alg": "RS256",
"n": "i0B67f1jggT9QJlZ_8QL9QQ56LfurrqDhpuu8BxtVcfxrYmaXaCtqTn7OfCuca7cGHdrJIjq99rz890NmYFZuvhaZ-LMt2iyiSb9LZJAeJmHf7ecguXS_-4x3hvbsrgUDi9tlg7xxbqGYcrco3anmalAFxsbswtu2PAXLtTnUo6aYwZsWA6ksq4FL3-anPNL5oZUgIp3HGyhhLTLdlQcC83jzxbguOim-0OEz-N4fniTYRivK7MlibHKrJfO3xa_6whBS07HW4Ydc37ZN3Rx9Ov3ZyV0idFblU519nUdqp_inXj1eEpynlxH60Ys_aTU2POGZh_25KXGdF_ZC_MSRw"
}
]
}
Para la ruta route-b, configure el plugin de la siguiente manera:
_disable_: true
En este ejemplo, route-b es el nombre de ruta introducido al crear la ruta de la puerta de enlace. Dado que _disable_ se estableció en true, el plugin se deshabilita cuando una solicitud coincide con esta ruta. No se ejecuta ninguna autenticación JWT y se permite el acceso a todos los usuarios.
Para las solicitudes que no coinciden con la ruta route-b, se ejecuta la autenticación JWT porque global_auth se estableció en true a nivel de instancia. Tanto consumer1 como consumer2 tienen permitido el acceso.
Habilitar a nivel de nombre de dominio pero deshabilitar para una ruta específica
Configure el plugin a nivel de instancia de la siguiente manera:
consumers:
- name: consumer1
issuer: abcd
jwks: |
{
"keys": [
{
"kty": "oct",
"kid": "123",
"k": "hM0k3AbXBPpKOGg__Ql2Obcq7s60myWDpbHXzgKUQdYo7YCRp0gUqkCnbGSvZ2rGEl4YFkKqIqW7mTHdj-bcqXpNr-NOznEyMpVPOIlqG_NWVC3dydBgcsIZIdD-MR2AQceEaxriPA_VmiUCwfwL2Bhs6_i7eolXoY11EapLQtutz0BV6ZxQQ4dYUmct--7PLNb4BWJyQeWu0QfbIthnvhYllyl2dgeLTEJT58wzFz5HeNMNz8ohY5K0XaKAe5cepryqoXLhA-V-O1OjSG8lCNdKS09OY6O0fkyweKEtuDfien5tHHSsHXoAxYEHPFcSRL4bFPLZ0orTt1_4zpyfew",
"alg": "HS256"
}
]
}
- name: consumer2
issuer: abc
jwks: |
{
"keys": [
{
"kty": "RSA",
"e": "AQAB",
"use": "sig",
"kid": "123",
"alg": "RS256",
"n": "i0B67f1jggT9QJlZ_8QL9QQ56LfurrqDhpuu8BxtVcfxrYmaXaCtqTn7OfCuca7cGHdrJIjq99rz890NmYFZuvhaZ-LMt2iyiSb9LZJAeJmHf7ecguXS_-4x3hvbsrgUDi9tlg7xxbqGYcrco3anmalAFxsbswtu2PAXLtTnUo6aYwZsWA6ksq4FL3-anPNL5oZUgIp3HGyhhLTLdlQcC83jzxbguOim-0OEz-N4fniTYRivK7MlibHKrJfO3xa_6whBS07HW4Ydc37ZN3Rx9Ov3ZyV0idFblU519nUdqp_inXj1eEpynlxH60Ys_aTU2POGZh_25KXGdF_ZC_MSRw"
}
]
}
Para la ruta route-b, configure el plugin de la siguiente manera:
_disable_: true
Para el nombre de dominio *.example.com, configure el plugin de la siguiente manera:
allow:
- consumer1
- consumer2
En este ejemplo, route-b es el nombre de ruta introducido al crear la ruta de la puerta de enlace. Como _disable_ se estableció en true, el plugin se deshabilita cuando una solicitud coincide con esta ruta. No se ejecuta ninguna autenticación JWT y se permite el acceso a todos los usuarios.
Además, *.example.com se usa para coincidir con el nombre de dominio de la solicitud. Cuando el nombre de dominio coincide, se permite el acceso a los llamantes con el nombre consumer1 o consumer2, mientras que se deniega al resto.
Las reglas se evalúan de forma secuencial: se aplica la primera coincidencia y no se evalúan más reglas. Las reglas de ruta tienen prioridad sobre las de nombre de dominio, por lo que puede habilitar el plugin para un nombre de dominio y deshabilitarlo para una ruta específica dentro de ese dominio.
Códigos de error relacionados
|
Código de estado HTTP |
Mensaje de error |
Causa |
|
401 |
Jwt missing |
El encabezado de solicitud no proporciona un JWT. |
|
401 |
Jwt expired |
El JWT expiró. |
|
401 |
Jwt verification fails |
La validación del payload del JWT falló. Por ejemplo, el campo |
|
403 |
Access Denied |
No hay permiso para acceder a la ruta actual. |