Todos los productos
Search
Centro de documentos

API Gateway:Plugin jwt-auth

Última actualización: Sep 19, 2026

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 jwks o remote_jwks.

-

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 jwks o remote_jwks.

{"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 jwks como remote_jwks, el JWKS obtenido de forma remota tiene prioridad.

Nota

El tamaño del JWKS devuelto por remote_jwks debe ser menor a 1 MB. Si el tamaño supera este límite y ocurre un error, únase al grupo de DingTalk 88010006189 o envíe un ticket para obtener asistencia.

issuer

string

Opcional

-

El emisor del JWT. Debe coincidir con el campo iss del payload.

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 aud: mobile-site, el campo aud del payload debe ser mobile-site.

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 exp e iat del JWT.

keep_token

bool

Opcional

true

Indica si se conserva el JWT al reenviar la solicitud al backend.

Nota

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.

Importante
  • 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-Consumer para 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.

Nota

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
Nota
  • En este ejemplo, route-a y route-b son 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 nombre consumer1 y se deniega al resto.

  • Aquí, *.example.com y test.com se 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 nombre consumer2 y 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 iss no coincide.

403

Access Denied

No hay permiso para acceder a la ruta actual.