Configurando o Keycloak com o Kong
Requisitosā
-
Certifique-se de que o ambiente Kong estĆ” configurado executando:
make kong.up -
Certifique-se de que o arquivo
/etc/hostscontenha as seguintes entradas:127.0.0.1 api.freterapido.local # Rota de APIs
127.0.0.1 login.shippon.local # Acesso ao Keycloak
127.0.0.1 kong.freterapido.local # Acesso ao Kong
Etapas de Configuraçãoā
1. Acesse o Kong Managerā
- Acesse via navegador:
http://kong.freterapido.localouhttp://localhost:8002.
2. Crie um ServiƧoā
-
Navegue atƩ "Gateway Services".
-
Clique em "Add a Gateway Service".

-
Preencha os seguintes dados:
- Nome:
api-external - Protocolo:
http - Host:
api-external - Porta:
80 - Caminho:
/api-external
- Nome:
-
Salve a configuração.
Repita este processo para os demais serviƧos e APIs expostas.
3. Crie uma Rotaā
-
Na aba "Routes" do serviƧo
api-external, clique em "+ New Route".
-
Configure:
- Nome:
api-external - Caminhos:
/api-external - Hosts:
api.freterapido.local
- Nome:
-
Salve.
4. Adicione o Plugin JWTā
-
Acesse "Plugins" e clique em "+ New Plugin".

-
Selecione "JWT" e ative o plugin.

-
Salve.
5. Configure o JWTā
- Configure o campo "Claims To Verify" com
exp. - Salve.
6. Crie um Consumidorā
-
Acesse "Consumers" e clique em "+ New Consumer".

-
Preencha os campos necessƔrios e salve.

7. Ative o Plugin JWT no Consumidorā
- Acesse o consumidor criado.
- No menu lateral, selecione "Credentials".
- Clique em "+ New JWT Credential".

Deixe esta tela aberta para uso posterior.
Keycloakā
Acesse login.shippon.local com:
- UsuƔrio: admin
- Senha: admin
8. Crie um Realmā
-
Acesse "Create realm".

-
Nome:
kong
-
Certifique-se de que estĆ” habilitado e clique em "Create".
9. Crie um Clientā
-
Em "Clients", clique em "Create client".

-
Preencha:
- Client type:
OpenID Connect - Client ID:
kong-client - Clique em "Next"

- Client type:
9.1 Configure PermissƵesā
- Aba "Capability config": habilite "Client authentication" e "Standard flow".

9.2 Crie Escopos e Mappersā
-
Clique em "Create client scope".

-
Preencha:
- Nome:
kong-fr - Descrição:
Scope customizado Frete RƔpido - Tipo:
Padrão - Protocolo:
OpenID Connect - Ative: "Exibir na tela de consentimento" e "Incluir no token"

- Nome:
-
Salve.
Mappersā
-
Aba "Mappers": clique em "Create".

-
Tipo:
User attribute- Nome:
company_token - Atributo:
company_token - Claim:
company_token - JSON Type:
String - Ative: ID Token, Access Token, Userinfo

- Nome:
-
Repita para:
company_id,company_type,user_api_id
Escopo: groupsā
-
Adicione mais um escopo: "Group Membership"

-
Nome:
groups
-
Resultado final:

9.3 Atribua Escopos ao Clienteā
-
Aba "Client scopes" do
kong-client: clique em "Add client scope". -
Adicione
profileekong-fr, marcando como "Default".
-
Salve.
10. Crie um UsuĆ”rioā
- Acesse "Users" > "Create new user"

- Nome de usuƔrio:
freterapido
- Salve.
11. Defina a Senhaā
-
Aba "Credentials": clique em "Set password"

-
Defina:
12345678, desmarque "Temporary"
-
Salve.
-
Acesse aba "Attributes" e preencha conforme esperado.

12. Obtenha a Key (KID)ā
- "Realm settings" > aba "Keys"

- Anote o
Kidda chaveRS256
13. Copie a Chave PĆŗblicaā
- Clique em "Public key" da chave
RS256, copie e feche
14. Copie o Client Secretā
- Aba "Credentials" do
kong-client, copie o secret
15. Configure o Plugin no Kongā
-
Retorne ao Kong e preencha:
-
key(Kid) do passo 12 -
secretdo passo 14 -
Algoritmo:
RS256 -
Chave pĆŗblica (em formato:
-----BEGIN PUBLIC KEY-----
{chave}
-----END PUBLIC KEY-----)

-
16. Configure os Atributosā
- (Descrever etapa caso "asd" seja um marcador temporƔrio)

Verificaçãoā
Obtenha um Token JWTā
curl --request POST \
--url https://login.shippon.local/realms/kong/protocol/openid-connect/token \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data grant_type=password \
--data client_id=kong-client \
--data client_secret={Client secret do passo 14} \
--data username=freterapido \
--data password=12345678
FaƧa uma Requisição Autenticadaā
curl --request POST \
--url 'https://api.freterapido.local/api/external/transportadora/v1/quotes/FR2505077IGLS/occurrences' \
--header 'Authorization: Bearer {access_token}' \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--data '{
"cnpj_remetente": "25438296000158",
"ocorrencia": 1,
"data_hora": "2024/04/08 17:00:00",
"mensagem": "teste"
}'
Se tudo estiver correto, a API externa deve responder conforme esperado.