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 |
- |
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 |
{"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 Nota
O tamanho do JWKS retornado por |
|
issuer |
string |
Opcional |
- |
Emissor do JWT. Deve corresponder ao campo |
|
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 |
|
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 |
|
keep_token |
bool |
Opcional |
true |
Indica se o JWT deve ser mantido ao encaminhar a requisição para o backend. |
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. |
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.
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
Neste exemplo,
route-aeroute-bsã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 nomeconsumer1recebem permissão de acesso. Outros chamadores têm o acesso negado.Aqui,
*.example.cometest.comservem para corresponder ao nome de domínio da requisição. Havendo correspondência, chamadores identificados comoconsumer2podem 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 |
|
403 |
Access Denied |
Sem permissão para acessar a rota atual. |