Todos os produtos
Search
Central de documentação

API Gateway:Plugin jwt-auth

Última atualização: Jun 27, 2026

O plugin jwt-auth autentica e autoriza requisições com base em JSON Web Tokens (JWT). Ele extrai o JWT de parâmetros de URL, cabeçalhos de requisição ou cookies e valida o token para conceder ou negar acesso. Diferentemente da Autenticação e autorização JWT, este plugin também identifica os chamadores, permitindo configurar credenciais JWT distintas para cada um.

Campos de configuração

Configuração de autenticação

Nome

Tipo de dado

Obrigatório

Valor padrão

Descrição

consumers

array of object

Obrigatório

-

Consumidores do serviço usados para autenticar requisições.

global_auth

Array of strings

Opcional (apenas configuração no nível da instância)

-

Configurável somente no nível da instância. Se definido como true, a autenticação aplica-se globalmente. Se definido como false, aplica-se apenas aos nomes de domínio e rotas configurados. Caso não haja configuração, a autenticação será global apenas quando não existirem configurações de nome de domínio ou rota, mantendo a compatibilidade com versões anteriores.

A tabela a seguir descreve os campos de cada item em consumers.

Nome

Tipo de dado

Obrigatório

Valor padrão

Descrição

name

string

Obrigatório

-

Nome do consumidor.

jwks

string

Opcional. É necessário definir jwks ou remote_jwks.

-

String JSON Web Key Set (JWKS) conforme especificado em JSON Web Key (JWK), contendo a chave pública ou simétrica usada para verificar a assinatura do JWT.

remote_jwks

object

Opcional. Escolha entre jwks ou remote_jwks.

{"uri":"http://127.0.0.1/keys","service":"test.static","port":"80","ttl":30000,"timeout":3000}

Obtém periodicamente o JWKS de uma URI de serviço especificada. Se ambos jwks e remote_jwks estiverem configurados, o JWKS obtido remotamente terá precedência.

Nota

O tamanho do JWKS retornado por remote_jwks deve ser inferior a 1 MB. Se o tamanho exceder esse limite e ocorrer um erro, entre no grupo DingTalk 88010006189 ou envie um ticket para obter suporte.

issuer

string

Opcional

-

Emissor do JWT. Deve corresponder ao campo iss no payload.

claims

object

Opcional

-

Pares chave-valor correspondentes aos pares chave-valor no payload, usados para verificar se vários campos coincidem com o payload. Por exemplo, se você configurar aud: mobile-site, o campo aud no payload deverá ser mobile-site.

claims_to_headers

array of object

Opcional

-

Extrai campos específicos do payload do JWT e os define como cabeçalhos de requisição antes de encaminhar para o backend.

from_headers

array of object

Opcional

[{"name":"Authorization","value_prefix":"Bearer"}]

Extrai o JWT dos cabeçalhos de requisição especificados.

from_params

array of string

Opcional

access_token

Extrai o JWT dos parâmetros de URL especificados.

from_cookies

array of string

Opcional

-

Extrai o JWT dos cookies especificados.

clock_skew_seconds

number

Opcional

60

Divergência de relógio permitida, em segundos, ao verificar os campos exp e iat do JWT.

keep_token

bool

Opcional

true

Indica se o JWT deve ser mantido ao encaminhar a requisição para o backend.

Nota

Os valores padrão são usados apenas quando from_headers, from_params e from_cookies não estiverem configurados.

  • A tabela abaixo detalha os campos de cada item em from_headers.

    Nome

    Tipo de dado

    Obrigatório

    Valor padrão

    Descrição

    name

    string

    Obrigatório

    -

    Cabeçalho de requisição de onde o JWT é extraído.

    value_prefix

    string

    Obrigatório

    -

    Prefixo a ser removido do valor do cabeçalho. A parte restante é tratada como o JWT.

  • Veja a seguir os campos disponíveis para cada elemento de claims_to_headers.

    Nome

    Tipo de dado

    Obrigatório

    Valor padrão

    Descrição

    claim

    string

    Obrigatório

    -

    Campo específico no payload do JWT. O valor deve ser uma string ou um inteiro sem sinal.

    header

    string

    Obrigatório

    -

    Cabeçalho de requisição a ser preenchido com o valor da claim extraída e encaminhado ao backend.

    override

    bool

    Opcional

    true

    • Se true, substitui o cabeçalho de requisição caso já exista um com o mesmo nome.

    • Se false, adiciona o valor como um cabeçalho de requisição duplicado.

  • Confira na tabela seguinte os atributos de cada entrada em remote_jwks.

    Nome

    Tipo de dado

    Obrigatório

    Valor padrão

    Descrição

    uri

    string

    Obrigatório

    -

    URL da requisição.

    service

    string

    Obrigatório

    -

    • Exemplo para serviço Kubernetes: foo.default.svc.cluster.local.

    • Exemplo para serviço Nacos: foo.DEFAULT-GROUP.public.nacos.

    • Para um serviço DNS chamado test, insira test.dns.

    • Para um serviço de IP estático chamado test, insira test.static.

    port

    bool

    Obrigatório

    -

    Porta do serviço.

    timeout

    bool

    Opcional

    3000

    Tempo limite da requisição ao serviço, em milissegundos.

    ttl

    bool

    Opcional

    30000

    Duração do cache, em milissegundos.

Configuração de autorização (opcional)

Nome

Tipo de dado

Obrigatório

Valor padrão

Descrição

allow

array of string

Opcional (não aplicável à configuração no nível da instância)

-

Configurável apenas em regras granulares, como rotas ou nomes de domínio. Especifica quais consumidores têm permissão para acessar o recurso correspondente.

Importante
  • Não é possível usar configurações de autorização e autenticação na mesma regra.

  • Para requisições aprovadas na autenticação e autorização, o cabeçalho X-Mse-Consumer é adicionado à requisição para identificar o nome do chamador.

Exemplos de configuração

Configurar autenticação global e autorização no nível da rota

Este exemplo ativa a autenticação JWT global no nível da instância e restringe o acesso no nível da rota a consumidores específicos.

Nota

Se um JWT corresponder a múltiplos JWKS, o primeiro consumidor correspondente na ordem de configuração será utilizado.

Configuração do plugin

Configure o plugin no nível da instância da seguinte forma:

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"
        }
      ]
    }

Configuração de rota e nome de domínio

Para as rotas route-a e route-b, configure o plugin conforme abaixo:

allow:
- consumer1

Para os nomes de domínio *.example.com e test.com, configure o plugin da seguinte maneira:

allow:
- consumer2
Nota
  • Neste exemplo, route-a e route-b são os nomes das rotas inseridos durante a criação das rotas do gateway. Quando uma requisição corresponde a essas rotas, chamadores com o nome consumer1 recebem permissão de acesso. Outros chamadores têm o acesso negado.

  • Aqui, *.example.com e test.com servem para corresponder ao nome de domínio da requisição. Havendo correspondência, chamadores identificados como consumer2 podem acessar. Os demais são bloqueados.

Exemplos de requisição

As requisições a seguir são permitidas nesta configuração. Estes exemplos assumem que as requisições correspondem à rota route-a.

  • Defina o JWT em um parâmetro de URL.

    curl  'http://xxx.hello.com/test?access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEy****.eyJpc3MiOiJhYmNkIiwic3ViIjoidGVzdCIsImlhdCI6MTY2NTY2MDUyNywiZXhwIjoxODY1NjczODE5fQ.-vBSV0bKeDwQcuS6eeSZN9dLTUnSnZVk8eVCXdooCQ4'
  • Defina o JWT em um cabeçalho de requisição HTTP.

    curl  http://xxx.hello.com/test -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJpc3MiOiJhYmNkIiwic3ViIjoidGVzdCIsImlhdCI6MTY2NTY2MDUyNywiZXhwIjoxODY1NjczODE5fQ.-vBSV0bKeDwQcuS6eeSZN9dLTUnSnZVk8eVCXdooCQ4'

Verificar o resultado

Após a autenticação bem-sucedida, o cabeçalho X-Mse-Consumer é adicionado à requisição com o nome do chamador. Neste exemplo, seu valor é consumer1.

As requisições a seguir serão negadas.

  • A requisição não fornece um JWT, resultando em um erro 401.

  • O chamador identificado pelo JWT fornecido não possui permissão de acesso, gerando um erro 403.

Ativar no nível da instância do gateway, mas desativar para uma rota específica

Configure o plugin no nível da instância conforme mostrado abaixo:

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 a rota route-b, configure o plugin assim:

_disable_: true

Neste cenário, route-b representa o nome da rota definido na criação da rota do gateway. Como _disable_ está definido como true, o plugin é desativado sempre que uma requisição corresponder a essa rota. Nenhuma autenticação JWT ocorre e todos os usuários obtêm acesso liberado.

Requisições que não corresponderem à rota route-b passarão pela autenticação JWT, pois global_auth está definido como true no nível da instância. Tanto consumer1 quanto consumer2 terão acesso permitido.

Ativar no nível do nome de domínio, mas desativar para uma rota específica

Configure o plugin no nível da instância da seguinte forma:

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"
        }
      ]
    }

Na rota route-b, aplique a seguinte configuração ao plugin:

_disable_: true

Quanto ao nome de domínio *.example.com, configure o plugin assim:

allow:
- consumer1
- consumer2

Neste caso, route-b é o nome atribuído à rota durante sua criação no gateway. Visto que _disable_ foi ajustado para true, qualquer requisição que atinja essa rota encontrará o plugin desabilitado. Consequentemente, não há verificação JWT e o acesso fica livre para todos os usuários.

O padrão *.example.com serve para casar com o domínio da requisição. Quando houver correspondência, o acesso será concedido aos chamadores consumer1 ou consumer2. Demais chamadores serão recusados.

A avaliação das regras segue uma ordem sequencial: a primeira correspondência prevalece e interrompe a análise das regras subsequentes. Regras de rota possuem prioridade sobre regras de nome de domínio, possibilitando habilitar o plugin para um domínio inteiro e, simultaneamente, desabilitá-lo para uma rota específica dentro desse domínio.

Códigos de erro relacionados

Código de status HTTP

Mensagem de erro

Causa

401

Jwt missing

O cabeçalho da requisição não contém um JWT.

401

Jwt expired

O JWT expirou.

401

Jwt verification fails

Falha na validação do payload do JWT. Por exemplo, o campo iss não corresponde.

403

Access Denied

Sem permissão para acessar a rota atual.