Este proyecto es una Prueba de Concepto (POC) que demuestra la implementación de un API Gateway utilizando Kong, integrado con Keycloak para la gestión de identidades (IAM) y una API Node.js protegida.
La arquitectura se basa en microservicios orquestados con Docker Compose:
graph TD
User([Usuario / Cliente])
Kong[Kong Gateway]
KC[Keycloak IAM]
API[API Node.js]
DB[(Postgres DB)]
User -->|Solicitud /getData| Kong
Kong <-->|Validación OIDC / Introspección| KC
Kong -->|Proxy a /api/getEspecificData| API
KC <--> DB
Kong <--> DB
- Kong Gateway: Actúa como el único punto de entrada. Utiliza el plugin
oidcpara validar que las peticiones tengan un token JWT válido antes de redirigirlas. - Keycloak: Servidor de identidad que maneja el Realm
poc-realm, clientes y usuarios. - API Node.js: Un servicio simple que expone datos. Aunque está detrás de Kong, realiza una validación secundaria del JWT usando JWKS por seguridad "Zero Trust".
- Postgres: Base de datos compartida (en diferentes esquemas/DBs) para Keycloak y Kong.
- Docker y Docker Compose instalados.
- Clona el repositorio.
- Configuración del Host Local: Para que la validación de tokens funcione correctamente entre tu máquina y el contenedor de Kong/API, debes añadir
keycloaka tu archivo de hosts.- Windows: Ejecuta el Bloc de Notas como administrador y abre
C:\Windows\System32\drivers\etc\hosts. Añade la siguiente línea al final:127.0.0.1 keycloak - Linux/macOS: Edita
/etc/hostscon privilegios de root (sudo nano /etc/hosts):127.0.0.1 keycloak
- Windows: Ejecuta el Bloc de Notas como administrador y abre
- Ejecuta el siguiente comando para levantar todos los servicios:
docker-compose up -d --build
- El sistema estará listo cuando todos los contenedores reporten estado
healthyorunning.
- Autenticación: El cliente obtiene un token JWT de Keycloak.
- Validación en Gateway: Kong intercepta la petición en
/getData, extrae el token y lo valida contra el endpoint de introspección de Keycloak. - Propagación: Si es válido, Kong redirige la petición a la API interna.
- Validación en API: La API recibe el token, obtiene la clave pública de Keycloak (
jwks_uri) y verifica la firma y el emisor (issuer) del token antes de responder con los datos.
GET http://localhost:8000/getData: Endpoint protegido que requiere un Bearer Token.
- Keycloak Admin: http://localhost:8080 (Admin:
admin/admin) - Kong Admin API: http://localhost:8001
- Kong Manager (GUI): http://localhost:8002
curl -X POST "http://keycloak:8080/realms/poc-realm/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=api-a" \
-d "client_secret=api-a-secret" \
-d "grant_type=client_credentials"curl -X POST "http://keycloak:8080/realms/poc-realm/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=api-b" \
-d "client_secret=api-b-secret" \
-d "grant_type=client_credentials"Si usas este token contra /getData, la API responderá con un 403 Forbidden.
Una vez tengas el token, puedes llamar a la API:
curl -H "Authorization: Bearer <TU_TOKEN_AQUÍ>" http://localhost:8000/getData-
Seguridad Multi-cliente: La API valida el campo
azp(Authorized Party) del token. Si un token fue emitido paraapi-b, laapi-alo rechazará aunque la firma sea válida. -
Modo Base de Datos: Kong está configurado para usar Postgres. A diferencia del modo DB-less, la configuración no se carga automáticamente al iniciar Kong.
-
Importación Automática: He añadido un servicio
kong-config-importen eldocker-compose.ymlque ejecutakong config db_importpara cargar tu archivokong.ymlen la base de datos cada vez que levantas el entorno. -
Kong Plugin OIDC: Configurado para el cliente
api-acon autenticaciónbearer_only. -
Keycloak Realm: Se importa automáticamente al iniciar desde
./keycloak/realm-export.json. -
API Node.js: Escucha en el puerto 3000 internamente y valida tokens contra
http://keycloak:8080.