Todos los productos
Search
Centro de documentos

API Gateway:jwt-logout

Última actualización: Sep 19, 2026

El complemento jwt-logout utiliza Redis para implementar una gestión de estado débil en los JSON Web Tokens (JWT). Esto permite invalidar los JWT de forma proactiva y controlar el inicio de sesión en un solo dispositivo. Por ejemplo, cuando un usuario inicia sesión desde un dispositivo nuevo, la sesión anterior se invalida automáticamente.

Tipo de complemento

Complemento de autenticación y autorización.

Campos

Campo

Tipo de datos

Obligatorio

Valor predeterminado

Descripción

jwks

string

No

-

Cadena JSON para la verificación del JWT. No es obligatoria cuando este complemento se usa junto con el complemento jwt-auth. Para obtener más información, consulte JSON Web Key (JWK).

clock_skew

number

No

60

Desfase de reloj permitido al verificar los campos exp e iat de un JWT. Unidad: segundos.

token_header

string

No

Authorization

Encabezado de solicitud del que se extrae el JWT.

token_prefix

string

No

"Bearer"

Prefijo del valor del encabezado. Una vez eliminado el prefijo, la parte restante se utiliza como JWT.

redis

Redis

Sí

-

Configuración del servicio de Redis.

logout

Logout

No

-

Configuración de la función de cierre de sesión con JWT. Si no se configura, esta función permanece deshabilitada.

login

Login

No

-

Configuración de la función de inicio de sesión en un solo dispositivo con JWT. Si no se configura, esta función permanece deshabilitada.

A continuación se describen los campos de configuración del tipo Redis.

Campo

Tipo de datos

Obligatorio

Valor predeterminado

Descripción

service

string

Sí

-

Nombre del servicio de Redis. Ejemplos:

  • Dirección fija: my-redis.static

  • Nombre de dominio DNS: my-redis.dns

  • ACK: my-redis.default.svc.cluster.local

port

number

Sí

-

Número de puerto del servicio de Redis.

username

string

No

-

Nombre de usuario para el comando AUTH de Redis.

password

string

No

-

Contraseña para el comando AUTH de Redis.

timeout

number

No

1000

Tiempo de espera para los comandos de Redis. Unidad: milisegundos.

A continuación se describen los campos de configuración del tipo Logout.

Campo

Tipo de datos

Obligatorio

Valor predeterminado

Descripción

key_prefix

string

No

higress_jwt_logout_

Prefijo de la clave almacenada en Redis.

key

array of string

No

["jti"]

Clave en el payload del JWT que identifica a dicho token. Si la misma clave aparece en varios payloads de JWT, estos se consideran idénticos. Si la clave está ausente en el payload, se devuelve un error 401 de token no válido.

path

string

No

/jwt_logout

Cadena utilizada para coincidir con el sufijo de la ruta de la URL. Si hay coincidencia, el JWT de la solicitud actual se invalida y ya no se puede utilizar.

error_status

number

No

401

Código de estado HTTP que se devuelve cuando se usa un JWT con la sesión cerrada.

error_body

string

No

'{"message":"invalid token"}'

Cuerpo de respuesta que se devuelve cuando se usa un JWT con la sesión cerrada.

ttl

number

No

-

Tiempo de vida (TTL) de la clave almacenada en Redis. Unidad: segundos. Determina cuánto tiempo permanece invalidado el JWT después del cierre de sesión. Si no se especifica, el TTL equivale al valor del campo exp en el payload menos la hora actual. Si el payload no contiene el campo exp, el TTL predeterminado es de 86,400 segundos (24 horas).

A continuación se describen los campos de configuración del tipo Login.

Campo

Tipo de datos

Obligatorio

Valor predeterminado

Descripción

key_prefix

string

No

higress_jwt_logout_

Prefijo de la clave almacenada en Redis.

key

array of string

No

["iss","aud","sub"]

Identificador de inicio de sesión en un solo dispositivo dentro del payload del JWT. Si el JWT de la solicitud actual contiene los mismos valores de campo que un JWT autenticado previamente, pero no es exactamente el mismo token, la solicitud se rechaza por inicio de sesión duplicado. El acceso se deniega hasta que expire la clave de Redis del JWT autenticado. Si el campo está ausente en el payload, se devuelve un error 401 de token no válido.

path

string

No

/jwt_login

Cadena utilizada para coincidir con el sufijo de la ruta de la URL. Si hay coincidencia, el JWT de la solicitud actual se convierte en el token de sesión activo. Cualquier JWT autenticado previamente con las mismas características de payload queda invalidado.

error_status

number

No

403

Código de estado HTTP que se devuelve ante intentos de inicio de sesión duplicados.

error_body

string

No

'{"message":"already login on other device"}'

Cuerpo de respuesta que se devuelve ante intentos de inicio de sesión duplicados.

ttl

number

No

-

TTL de la clave almacenada en Redis. Unidad: segundos. Determina el periodo de validez de un JWT para inicio de sesión en un solo dispositivo. Si no se especifica, el TTL equivale al valor del campo exp en el payload menos la hora actual. Si el payload no contiene el campo exp, el TTL predeterminado es de 86,400 segundos (24 horas).

Ejemplos de configuración

Usar una instancia de ApsaraDB for Redis

  1. Cree una instancia de ApsaraDB for Redis. Para obtener más información, consulte Overview.

  2. Habilite las configuraciones de cierre e inicio de sesión. Cuando el complemento procesa una solicitud, genera una solicitud de lectura en Redis para comprobar la configuración de cierre de sesión y dos solicitudes de lectura para comprobar la de inicio de sesión. En casos poco frecuentes, como un cierre de sesión o un primer inicio de sesión, se generan dos solicitudes de escritura adicionales en Redis. Para estimar la capacidad de la instancia de ApsaraDB for Redis, multiplique por 2 el rendimiento de las solicitudes que procesa el complemento.

  3. Una vez configurada la instancia de ApsaraDB for Redis, obtenga el endpoint de VPC de dicha instancia. Ejemplo: r-xxxxxxx.redis.rds.aliyuncs.com.

  4. Agregue un servicio. Seleccione DNS Domain Name en la lista desplegable Service Source, introduzca el número de puerto de Redis (6379 en la mayoría de los casos) en el campo Service Port, introduzca el endpoint de VPC en el campo Domain Names y seleccione Disabled en la lista desplegable TLS Mode. Para obtener más información, consulte Create a service.

  5. Agregue el siguiente contenido a la configuración del complemento para conectarse a la instancia de ApsaraDB for Redis:

    redis:
      service: redis.dns
      port: 6379

    Si configuró una contraseña para el servicio de Redis, agregue el siguiente contenido:

    redis:
      service: redis.dns
      port: 6379
      password: ****** # Enter the password that you specify.

Implementar la función de cierre de sesión con JWT

Escenarios de uso

Los JWT son tokens sin estado que permanecen válidos hasta su expiración. Utilice el complemento jwt-logout para invalidar de forma forzosa un JWT específico antes de que expire.

Funcionamiento

  • Si el sufijo de la ruta de la solicitud coincide con el parámetro path de la configuración del complemento, se activa el mecanismo de cierre de sesión. La instancia de ApsaraDB for Redis registra el JWT correspondiente. La clave almacenada en dicha instancia se compone del prefijo configurado, junto con la clave y el valor extraídos del payload del JWT actual.

  • Si el payload del JWT incluido en la solicitud coincide con las características de la clave almacenada en la instancia de ApsaraDB for Redis, el sistema considera que el JWT actual no es válido y rechaza la solicitud.

  • La hora de expiración predeterminada de la clave almacenada en la instancia de ApsaraDB for Redis se calcula a partir del campo exp en el payload del JWT. De este modo, la clave se conserva hasta que el JWT expire.

Nota
  • La clave de cierre de sesión predeterminada recomendada por el complemento es ["jti"], donde jti es el campo del payload que identifica de forma única a un JWT. Según los estándares de JWT, si el valor de jti en el payload coincide con el registrado en la instancia de ApsaraDB for Redis, todo el JWT es exactamente igual. Por lo tanto, jti sirve para marcar el estado de cierre de sesión de un token.

  • Regla de concatenación de la clave almacenada en la instancia de ApsaraDB for Redis: <key_prefix><PayloadKey>##<PayloadValue>. PayloadKey es una lista de claves separadas por signos de número (#). PayloadValue es una lista de valores de clave separados por signos de número (#). Ejemplo: higress_jwt_logout_jti#iss##xxxxx#abcde.

  • Este complemento solo puede invalidar el token que se incluye en la solicitud actual durante el cierre de sesión. También puede especificar manualmente el token en la consola de ApsaraDB for Redis siguiendo la regla de concatenación anterior. Si la puerta de enlace detecta que la clave existe en la instancia de ApsaraDB for Redis, rechazará la solicitud de acceso basada en ese JWT.

Ejemplo

Configuración del complemento:

redis:
  service: redis.dns
  port: 6379
jwks: |
  {
    "keys": [
      {
        "kty": "oct",
        "kid": "123",
        "k": "hM0k3AbXBPpKOGg__Ql2Obcq7s60myWDpbHXzgKUQdYo7YCRp0gUqkCnbGSvZ2rGEl4YFkKqIqW7mTHdj-bcqXpNr-NOznEyMpVPOIlqG_NWVC3dydBgcsIZIdD-MR2AQceEaxriPA_VmiUCwfwL2Bhs6_i7eolXoY11EapLQtutz0BV6ZxQQ4dYUmct--7PLNb4BWJyQeWu0QfbIthnvhYllyl2dgeLTEJT58wzFz5HeNMNz8ohY5K0XaKAe5cepryqoXLhA-V-O1OjSG8lCNdKS09OY6O0fkyweKEtuDfien5tHHSsHXoAxYEHPFcSRL4bFPLZ0orTt1_4zpyfew",
        "alg": "HS256"
      }
    ]
  }
logout:
  path: "/jwt_logout"
  key: ["jti"]
  error_status: 401
  error_body: |
    {"message":"invalid token"}
  1. Active un cierre de sesión.

    curl  http://xxx.hello.com/test/jwt_logout -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJ4eHh4IiwiaXNzIjoiYWJjZCIsInN1YiI6InRlc3QiLCJhdWQiOiJ3d3cudGVzdC5jb20iLCJpYXQiOjE2NjU2NjA1MjcsImV4cCI6MTg2NTY3MzgxOX0.tmKF6qc1mOWNyCCzBOT2XKNoEGeEgr3EbhTKAQfq1io'
    
    # The following result is returned:
    {"message": "logout success"}

    Payload del token:

    {
        "jti": "xxxx",
        "iss": "abcd",
        "sub": "test",
        "aud": "www.test.com",
        "iat": 1665660527,
        "exp": 1865673819
    }

    En este caso, la clave higress_jwt_logout_jti##xxxx se almacena en la instancia de ApsaraDB for Redis.

  2. Después del cierre de sesión, no se permite el acceso basado en ese JWT.

    curl  http://xxx.hello.com/test/abc -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJ4eHh4IiwiaXNzIjoiYWJjZCIsInN1YiI6InRlc3QiLCJhdWQiOiJ3d3cudGVzdC5jb20iLCJpYXQiOjE2NjU2NjA1MjcsImV4cCI6MTg2NTY3MzgxOX0.tmKF6qc1mOWNyCCzBOT2XKNoEGeEgr3EbhTKAQfq1io'
    
    # The following result is returned:
    {"message":"invalid token"}

Implementar el cierre de sesión forzado basado en JWT

Escenarios de uso

Cuando una cuenta inicia sesión desde varios dispositivos con autenticación JWT, es posible que se emitan distintos tokens para cada uno. Utilice el complemento jwt-logout para aplicar el inicio de sesión en un solo dispositivo y mantener activa únicamente una sesión a la vez.

Funcionamiento

  • Al iniciar una solicitud, el sistema extrae el JWT de dicha solicitud y construye una clave de Redis con el prefijo configurado, además de la clave y el valor obtenidos del payload. Después, consulta el valor correspondiente a esa clave en la instancia de ApsaraDB for Redis. Si el valor no coincide con el de la clave del JWT actual, el sistema rechaza la solicitud de acceso.

  • Si el valor no existe, el JWT actual se escribe en la clave de Redis. La hora de expiración predeterminada de la clave en la instancia de ApsaraDB for Redis se calcula a partir del campo exp en el payload del JWT. Así, la clave se conserva hasta que el token expire. Durante el periodo de validez del JWT, no se permiten solicitudes de acceso basadas en otros tokens con las mismas características de payload.

  • Si el sufijo de la solicitud coincide con el parámetro path de la configuración del complemento, se activa el mecanismo de cierre de sesión forzado. El JWT actual se escribe como valor de la clave de Redis asociada. El token que permitió un inicio de sesión correcto y comparte las mismas características de payload queda invalidado tras el cierre. Esto garantiza el inicio de sesión en un solo dispositivo.

Nota
  • La clave de inicio de sesión predeterminada recomendada por el complemento es ["iss","aud","sub"]. En ella, iss indica el emisor del JWT, aud señala el escenario de uso y sub representa el sujeto del token. En la mayoría de los casos, esta combinación basta para garantizar el inicio de sesión en un solo dispositivo.

  • Regla de concatenación de la clave almacenada en la instancia de ApsaraDB for Redis: <key_prefix><PayloadKey>##<PayloadValue>. PayloadKey es una lista de claves separadas por signos de número (#). PayloadValue es una lista de valores de clave separados por signos de número (#). Ejemplo: higress_jwt_login_iss#aud#sub##xxxxx#abcde#fffff.

  • Para los JWT con las mismas características de payload, el primero que se utilice en una solicitud se escribe automáticamente en la instancia de ApsaraDB for Redis. Esto permite implementar la función de inicio de sesión en un solo dispositivo del complemento. Por lo tanto, no es necesario llamar a la operación de API para forzar el inicio de sesión. Solo debe llamar a dicha operación cuando requiera un cierre de sesión forzado en escenarios de inicio de sesión.

  • Al activar la lógica de cierre de sesión, se borra la clave de inicio de sesión del JWT actual almacenada en la instancia de ApsaraDB for Redis. Esta regla también aplica cuando habilita la función de cierre de sesión con JWT.

Ejemplo

Configuración del complemento:

redis:
  service: redis.dns
  port: 6379
jwks: |
  {
    "keys": [
      {
        "kty": "oct",
        "kid": "123",
        "k": "hM0k3AbXBPpKOGg__Ql2Obcq7s60myWDpbHXzgKUQdYo7YCRp0gUqkCnbGSvZ2rGEl4YFkKqIqW7mTHdj-bcqXpNr-NOznEyMpVPOIlqG_NWVC3dydBgcsIZIdD-MR2AQceEaxriPA_VmiUCwfwL2Bhs6_i7eolXoY11EapLQtutz0BV6ZxQQ4dYUmct--7PLNb4BWJyQeWu0QfbIthnvhYllyl2dgeLTEJT58wzFz5HeNMNz8ohY5K0XaKAe5cepryqoXLhA-V-O1OjSG8lCNdKS09OY6O0fkyweKEtuDfien5tHHSsHXoAxYEHPFcSRL4bFPLZ0orTt1_4zpyfew",
        "alg": "HS256"
      }
    ]
  }
login:
  path: "/jwt_login"
  key: ["iss","aud","sub"]
  error_status: 403
  error_body: |
    {"message":"already login on other device"}
  1. Complete correctamente una operación de inicio de sesión.

    curl  http://xxx.hello.com/test/abc -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJ6enp6IiwiaXNzIjoiYWJjZCIsImF1ZCI6Ind3dy5leGFtcGxlLmNvbSIsInN1YiI6InRlc3QiLCJpYXQiOjE2NjU2NjA1MjcsImV4cCI6MTg2NTY3MzgxOX0.WljMr5ucxfLF8SmeaaL25c0QG3IX04HoD0als9gglYg'

    Payload del token:

    {
        "jti": "zzzz",
        "iss": "abcd",
        "aud": "www.example.com",
        "sub": "test",
        "iat": 1665660527,
        "exp": 1865673819
    }

    En este caso, la clave higress_jwt_login_iss#aud#sub##abcd#www.example.com#abcd se almacena en la instancia de ApsaraDB for Redis. Su valor coincide con el del JWT actual.

  2. Rechace una solicitud de acceso cuando el payload del JWT tenga las mismas características.

    curl  http://xxx.hello.com/test/abc -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJqdGkiOiJ5eXl5eSIsImlzcyI6ImFiY2QiLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJ0ZXN0IiwiaWF0IjoxNjY1NjYwNTI5LCJleHAiOjE4NjU2NzM4MTl9.6vi6eKPWSKHQxfzBPrj3-SWI4Q5zGtWhqp38JIN3FEo'
    
    # The following result is returned:
    {"message":"already login on other device"}

    Payload del token:

    {
        "jti": "yyyyy",
        "iss": "abcd",
        "aud": "www.example.com",
        "sub": "test",
        "iat": 1665660527,
        "exp": 1865673819
    }

    Las características del payload coinciden entre el JWT actual y el del paso 1. Sin embargo, el campo que no forma parte de dichas características, jti, difiere entre ambos tokens. Por lo tanto, se rechaza la solicitud de acceso basada en este JWT.

  3. Fuerce un inicio de sesión.

    curl  http://xxx.hello.com/test/jwt_login -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJqdGkiOiJ5eXl5eSIsImlzcyI6ImFiY2QiLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJ0ZXN0IiwiaWF0IjoxNjY1NjYwNTI5LCJleHAiOjE4NjU2NzM4MTl9.6vi6eKPWSKHQxfzBPrj3-SWI4Q5zGtWhqp38JIN3FEo'
    
    # The following result is returned:
    {"message":"login success"}

    En este caso, la clave higress_jwt_login_iss#aud#sub##abcd#www.example.com#abcd se almacena en la instancia de ApsaraDB for Redis y su valor se reemplaza por el del JWT actual.

    Utilice el JWT actual para acceder correctamente a la página.

    curl  http://xxx.hello.com/test/abc -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJqdGkiOiJ5eXl5eSIsImlzcyI6ImFiY2QiLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJ0ZXN0IiwiaWF0IjoxNjY1NjYwNTI5LCJleHAiOjE4NjU2NzM4MTl9.6vi6eKPWSKHQxfzBPrj3-SWI4Q5zGtWhqp38JIN3FEo'

    Si utiliza el JWT del paso 1, se devolverá un mensaje de error.

    curl  http://xxx.hello.com/test/abc -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJqdGkiOiJ4eHh4IiwiaXNzIjoiYWJjZCIsImF1ZCI6Ind3dy5leGFtcGxlLmNvbSIsInN1YiI6InRlc3QiLCJpYXQiOjE2NjU2NjA1MjcsImV4cCI6MTg2NTY3MzgxOX0.P0WtBTHJzUJvklu9q8XSRszfPbgojrZHg7t4ZaYfKGo'
    
    # The following result is returned:
    {"message":"already login on other device"}

Códigos de error

Código de estado HTTP

Mensaje de error

Motivo

401

invalid token

No se proporcionó ningún JWT en el encabezado de la solicitud, el formato del JWT no es válido, o bien el token expiró o fue invalidado.

500

redis server error

No se puede establecer conexión con la instancia de ApsaraDB for Redis o se agotó el tiempo de espera de la conexión.