Este tutorial te guiará a través de la integración de **Kong** con **Keycloak** utilizando la validación de tokens **JWT** emitidos por Keycloak. Esto permitirá que Kong valide y proteja tus servicios API utilizando autenticación basada en JWT sin necesidad de plugins pagos.
Primero, necesitas configurar Keycloak para emitir tokens JWT que Kong pueda validar. Sigue estos pasos:
Inicia sesión en tu instancia de Keycloak y crea un nuevo cliente. Este cliente representará la aplicación o servicio que protegerás con Kong. Ve a Clients
y selecciona Create
.
kong-client
).openid-connect
.confidential
.En la sección de Credentials
de tu cliente, obtén el secreto que se usará para firmar los tokens JWT. Este secreto será necesario más adelante.
Configura los roles y los scopes que el cliente puede solicitar y que serán incluidos en los tokens JWT emitidos por Keycloak.
Kong necesitará el certificado público de Keycloak para validar los tokens JWT firmados. El endpoint de JWKS (JSON Web Key Set) es normalmente accesible en:
https://[KEYCLOAK_URL]/auth/realms/[REALM_NAME]/protocol/openid-connect/certs
Reemplaza [KEYCLOAK_URL]
y [REALM_NAME]
con los valores correspondientes a tu instancia de Keycloak.
Ahora que tienes Keycloak configurado y emitiendo tokens JWT, debes configurar Kong para validar estos tokens en las solicitudes entrantes a tus APIs protegidas.
Primero, crea un servicio en Kong que represente el backend de tu API. Usa el siguiente comando para crear un servicio:
curl -i -X POST http://localhost:8001/services/ \
--data 'name=my-api-service' \
--data 'url=http://backend-service'
Este comando crea un servicio en Kong que apunta a tu backend API en http://backend-service
.
Luego, crea una ruta en Kong que exponga el servicio creado en el paso anterior:
curl -i -X POST http://localhost:8001/services/my-api-service/routes \
--data 'paths[]=/my-api'
Esto crea una ruta para que las solicitudes a /my-api
sean dirigidas al servicio de backend.
Ahora aplica el plugin de JWT a la ruta o al servicio para validar los tokens JWT emitidos por Keycloak:
curl -i -X POST http://localhost:8001/services/my-api-service/plugins \
--data 'name=jwt' \
--data 'config.jwks_uri=https://[KEYCLOAK_URL]/auth/realms/[REALM_NAME]/protocol/openid-connect/certs' \
--data 'config.claims_to_verify=exp'
Reemplaza [KEYCLOAK_URL]
y [REALM_NAME]
con los valores correspondientes. Esto configura Kong para validar los tokens JWT usando la URL del JWKS de Keycloak, y también verifica el reclamo de expiración (exp
).
Ahora que Kong está configurado para validar los tokens JWT de Keycloak, puedes probar la integración.
Usa el siguiente comando para obtener un token JWT desde Keycloak utilizando el cliente configurado:
curl -X POST https://[KEYCLOAK_URL]/auth/realms/[REALM_NAME]/protocol/openid-connect/token \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data 'grant_type=client_credentials' \
--data 'client_id=kong-client' \
--data 'client_secret=[CLIENT_SECRET]' \
--data 'scope=openid'
Reemplaza [CLIENT_SECRET]
con el secreto del cliente que obtuviste en Keycloak. Este comando devolverá un token JWT.
Envía una solicitud a Kong con el token JWT para acceder a la API protegida:
curl -i -X GET http://localhost:8000/my-api \
--header 'Authorization: Bearer [JWT_TOKEN]'
Reemplaza [JWT_TOKEN]
con el token JWT obtenido en el paso anterior.
Si el token JWT es válido y no ha expirado, Kong permitirá el acceso a tu API. Si el token es inválido o ha expirado, Kong devolverá un error 401 Unauthorized
.