O plugin OAuth emite tokens de acesso OAuth 2.0 baseados em JSON Web Tokens (JWTs), em conformidade com a RFC 9068.
Tipo de plugin
Autenticação e autorização.
Configuração do plugin
Campos
Configuração de autorização
|
Campo |
Tipo de dados |
Obrigatório |
Valor padrão |
Descrição |
|
consumers |
array de objetos |
Sim |
- |
Chamadores (consumers) autorizados a solicitar autenticação. |
|
issuer |
string |
Não |
Higress-Gateway |
Emissor do JWT. |
|
auth_path |
string |
Não |
/oauth2/token |
Sufixo do caminho para emissão de token. Garanta que a rota corresponda a este caminho. Se utilizar o gerenciamento de API, crie uma API com o mesmo caminho. |
|
global_credentials |
bool |
Não |
true |
Defina se as credenciais emitidas em qualquer rota concedem acesso após a autenticação bem-sucedida do consumer. |
|
auth_header_name |
string |
Não |
Authorization |
Cabeçalho da requisição que contém o JWT. |
|
token_ttl |
number |
Não |
7200 |
Tempo de vida do token após a emissão, em segundos. |
|
clock_skew_seconds |
number |
Não |
60 |
Tolerância de diferença de relógio permitida para verificação dos campos exp e iat do JWT, em segundos. |
|
keep_token |
bool |
Não |
true |
Indica se o JWT deve ser mantido nas requisições encaminhadas ao backend. |
|
global_auth |
array de strings |
Não (Obrigatório apenas para configurações no nível de instância) |
- |
Exclusivo do nível de instância. Se definido como true, a autenticação aplica-se a todas as rotas. Se definido como false, aplica-se apenas aos domínios e rotas configurados. Se não for definido, a autenticação aplica-se globalmente apenas quando não existirem configurações no nível de domínio ou rota. |
Campos em consumers:
|
Campo |
Tipo de dados |
Obrigatório |
Valor padrão |
Descrição |
|
name |
string |
Sim |
- |
Nome do consumer. |
|
client_id |
string |
Sim |
- |
ID do cliente OAuth 2.0. |
|
client_secret |
string |
Sim |
- |
Segredo do cliente OAuth 2.0. |
Se uma rota corresponder a
auth_path, a requisição não será encaminhada ao backend; em vez disso, a rota gera um token.Caso
global_credentialsseja false, garanta que a rota com o plugin ativado não utilize correspondência exata. A coexistência com uma rota de correspondência por prefixo pode causar comportamento inesperado.Para requisições autenticadas, um cabeçalho
X-Mse-Consumeré adicionado para identificar o chamador.
(Opcional) Configuração de autorização
|
Campo |
Tipo de dados |
Obrigatório |
Valor padrão |
Descrição |
|
allow |
array de strings |
Não (Obrigatório para configurações fora do nível de instância) |
- |
Aplicável apenas nos níveis de rota ou domínio. Especifica quais consumers podem acessar requisições correspondentes, permitindo controle de permissões granular. |
As configurações de autorização e autenticação não podem coexistir na mesma regra.
Exemplos
Configuração de autorização no nível de rota
Aplique a seguinte configuração de plugin em route-a e route-b:
consumers:
- name: consumer1
client_id: 12345678-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_secret: abcdefgh-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Com essa configuração, as credenciais emitidas por route-a não conseguem acessar route-b e vice-versa.
Para compartilhar credenciais entre rotas:
global_credentials: true
consumers:
- name: consumer1
client_id: 12345678-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_secret: abcdefgh-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Configuração de autorização global e configuração de autenticação no nível de rota
A configuração a seguir ativa a autenticação JWT para rotas ou domínios específicos. Se um JWT corresponder a múltiplos JSON Web Key Sets (JWKSs), o primeiro consumer correspondente terá efeito.
Configuração no nível de instância:
global_auth: false
consumers:
- name: consumer1
client_id: 12345678-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_secret: abcdefgh-xxxx-xxxx-xxxx-xxxxxxxxxxxx
- name: consumer2
client_id: 87654321-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_secret: hgfedcba-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Configuração para route-a e route-b:
allow:
- consumer1
Configuração para *.example.com e test.com:
allow:
- consumer2
route-aeroute-bsão rotas do gateway. Requisições correspondentes a essas rotas permitem apenas o consumer chamadoconsumer1.*.example.cometest.comcorrespondem a nomes de domínio nas requisições. Requisições correspondentes a esses domínios permitem apenas o consumer chamadoconsumer2.
Ativar autenticação no nível do gateway
Ative a autenticação OAuth2 para todas as requisições do gateway:
global_auth: true
consumers:
- name: consumer1
client_id: 12345678-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_secret: abcdefgh-xxxx-xxxx-xxxx-xxxxxxxxxxxx
- name: consumer2
client_id: 87654321-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_secret: hgfedcba-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Exemplos de requisição
Usar o tipo de concessão Client Credential
Obter um token de acesso
# Obtain an access token by using the GET method. We recommend that you use this method.
curl 'http://test.com/oauth2/token?grant_type=client_credentials&client_id=12345678-xxxx-xxxx-xxxx-xxxxxxxxxxxx&client_secret=abcdefgh-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
# Obtain an access token by using the POST method. To perform this operation, you need to match a route that points to a real destination service. Otherwise, the gateway does not read request bodies.
curl 'http://test.com/oauth2/token' -H 'content-type: application/x-www-form-urlencoded' -d 'grant_type=client_credentials&client_id=12345678-xxxx-xxxx-xxxx-xxxxxxxxxxxx&client_secret=abcdefgh-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
# Obtain the value of the access_token field from the response.
{
"token_type": "bearer",
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6ImFwcGxpY2F0aW9uXC9hdCtqd3QifQ.eyJhdWQiOiJkZWZhdWx0IiwiY2xpZW50X2lkIjoiMTIzNDU2NzgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4IiwiZXhwIjoxNjg3OTUxNDYzLCJpYXQiOjE2ODc5NDQyNjMsImlzcyI6IkhpZ3Jlc3MtR2F0ZXdheSIsImp0aSI6IjEwOTU5ZDFiLThkNjEtNGRlYy1iZWE3LTk0ODEwMzc1YjYzYyIsInN1YiI6ImNvbnN1bWVyMSJ9.NkT_rG3DcV9543vBQgneVqoGfIhVeOuUBwLJJ4Wycb0",
"expires_in": 7200
}
Usar o token de acesso para iniciar uma requisição
curl 'http://test.com' -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6ImFwcGxpY2F0aW9uXC9hdCtqd3QifQ.eyJhdWQiOiJkZWZhdWx0IiwiY2xpZW50X2lkIjoiMTIzNDU2NzgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4IiwiZXhwIjoxNjg3OTUxNDYzLCJpYXQiOjE2ODc5NDQyNjMsImlzcyI6IkhpZ3Jlc3MtR2F0ZXdheSIsImp0aSI6IjEwOTU5ZDFiLThkNjEtNGRlYy1iZWE3LTk0ODEwMzc1YjYzYyIsInN1YiI6ImNvbnN1bWVyMSJ9.NkT_rG3DcV9543vBQgneVqoGfIhVeOuUBwLJJ4Wycb0'
Códigos de erro
|
Código de status HTTP |
Mensagem de erro |
Motivo |
|
401 |
Invalid Jwt token. |
O JWT está ausente, malformado ou expirado. |
|
403 |
Access Denied. |
O consumer não tem autorização para acessar esta rota. |