Configurando Kong como API Gateway para tus proyectos en Django

¿Que es un API Gateway?

Un API Gateway es un servidor que funciona como un único punto de entrada a un sistema encapsulando la arquitectura interna del sistema y provee una API adaptada a cada cliente. Además un API Gateway puede tener responsabilidades adicionales como autenticación, monitoreo, balanceo de carga, cache y manipulación del response del API.

Kong

Kong es un API Gateway y una capa de administración open source. Kong puede correr en frente que cualquier API RESTful y por medio de plugins agregar funcionalidades adicionales.

Kong es muy versátil ya que es modular, puede correr en múltiples plataformas y es escalable. Además dispone de una buena cantidad de plugins muchos de ellos disponibles para la Community Edition.

Integrando Kong y Django.

Para este ejemplo he creado un repositorio en Github en donde puedes seguir la configuración que he realizado para usar Kong como un API Gateway.

Configuración

El código del ejemplo va a tener 4 contenedores:

  • djcourses es un proyecto en Django con GraphQL como API y tiene varios endpoints de prueba unos que requieren autenticación y otros que no la requerirán.
  • redis es el Docker de soporte a la persistencia de las suscripciones de GraphQL en el contenedor djcourses.
  • kong-database base de datos en Postgres para soporte de persistencia en kong.
  • kong API Gateway.

Una vez corres el proyecto usando Docker (docker-compose up) tienes corriendo estos contenedores, a partir de este momento podemos empezar a configurar los endpoints.

  • Registrar proyecto de django en KONG.
POST http://localhost:8001/apis/  
{
    "hosts": ["localhost"],
    "upstream_url": "https://{YOUR_IP}:8080",
    "name": "django"
}
  • Agregar autenticación JWT. Es necesario agregar el config.key_claim_name con un valor único que se encuentre en el payload del Token JWT generado en Django. Por defecto el campo que podemos usar del payload es email. A partir de este momento para ingresar a cualquier URL del proyecto de Django vas a requerir autenticación.
POST http://localhost:8001/apis/django/plugins/  
{
    "name": "jwt",
    "config.key_claim_name": "email"
}
  • Agrega un usuario a Kong para que luego podamos asignarle credenciales de acceso al API
POST http://localhost:8001/consumers/  
{
    "username": "useremail@domain.com",
    "custom_id": "useremail@domain.com"
}
  • Agrega el acceso vía token JWT al usuario que has creado. Define como key el usuario que has definido y asegúrate que secret sea el key que estas usando para firmar el token JWT creado. Usualmente ese secret será el SECRET_KEY de tu proyecto en Django
POST http://localhost:8001/consumers/useremail@domain.com/jwt  
{
    "key": "useremail@domain.com",
    "secret": "JWT_SECRET_KEY"
}
  • Ahora ya puedes tener acceso al proyecto Django usando un token JWT.
GET http://localhost:8000/graphql/  
-H 'Authorization: Bearer TU_TOKEN_JWT'

De esta manera vas a poder agregar autenticación a varios API de forma sencilla y centralizada. Esto es muy útil cuando tienes varios micro servicios y de esta manera usando KONG vas a poder usar la autenticación en un solo lugar sin tener que agregar código y configuraciones adicionales a cada servicio.

Puedes agregar más plugins, por ejemplo Datadog, que te permitirá monitorizar el funcionamiento de tus APIs.

Mas información en:

Kong: https://konghq.com/
Plugins Kong: http://icons.iconarchive.com/icons/martz90/circle-addon1/256/text-plus-icon.png
Documentación Kong: https://getkong.org/docs/
Información adicional de micro servicios y api gateways: https://www.nginx.com/blog/introduction-to-microservices/

Carlos Martinez

Read more posts by this author.