Authorizer Lambda con Auth0 y JWT

Clase 20 de 30Curso de Ciberseguridad para Desarrollo Web

Contenido del curso

Resumen

Proteger endpoints en AWS API Gateway mediante un Lambda authorizer que valida tokens de Auth0 es una práctica esencial para asegurar APIs serverless. A continuación se explica paso a paso cómo configurar Auth0, escribir el authorizer en Go, desplegarlo con Terraform y verificar su funcionamiento con Postman.

¿Cómo se configura Auth0 antes de escribir el authorizer?

Antes de tocar código, es necesario revisar la configuración en Auth0 para que todo encaje correctamente [0:01].

  • Dentro de Applications, debe existir una regular web application llamada "myapp".
  • En Allow Callbacks URL se configura la redirección deseada, en este caso hacia Google.
  • En Conexiones, debe estar activada la base de datos donde se encuentran los usuarios.
  • Dentro de APIs, el identifier de "MyCourseAPI" se utiliza para las requests del token [0:40].
  • En Machine to Machine Applications, se apunta hacia "myapp" y se deshabilita la test application.

Una vez verificada esta configuración, el siguiente paso es ir al código.

¿Cómo se implementa el Lambda authorizer en Go?

Dentro del proyecto se crea un nuevo folder llamado Authorizer con su archivo principal [1:15]. Los authorizers son un tipo especial de Lambda: reciben un tipo de request diferente y deben devolver una respuesta particular, ya sea un booleano o una policy que permite o deniega el acceso.

¿Qué hacen los métodos de aceptar y denegar?

Se crean dos métodos auxiliares [1:45]:

  • Deny request: recibe una razón para poder loguearla y retorna un API Gateway custom authorizer response con efecto deny.
  • Allow request: recibe la ruta destino y retorna una policy con efecto allow sobre ese resource.

El handler recibe un evento de tipo APIGatewayV2CustomAuthorizerV2Request [2:30]. De ese evento se extrae el path (request.context.HTTP.path) y se convierte la estructura a JSON para imprimirla en logs.

Si el path corresponde a /commits (el endpoint de GitHub), se permite la request sin validación adicional. Para cualquier otro path, se valida el token de Auth0.

¿Cómo se valida el token con go-jose?

La librería go-jose permite realizar validaciones de JWT (JSON Web Token) en Go de forma sencilla [3:38]. Un JWT es el token de acceso que contiene en su header el algoritmo de cifrado y en su payload información como el issuer y la audience, datos configurados previamente en Auth0 [4:05].

Se instala con go get y se importa con el alias jose. El método clave es ParseSigned, que valida y decodifica el token [4:30]:

go _, err := jose.ParseSigned(authToken) if err != nil { return denyRequest(fmt.Sprintf("invalid auth0 token: %s", err.Error())) } return allowRequest(route)

El token se extrae del header Authorization del evento. Se remueve el prefijo Bearer con strings.TrimPrefix [5:25]. Si el header no existe o el token queda vacío después del trim, se deniega la petición con el mensaje "missing auth0 token".

¿Cómo se despliega y se prueba el authorizer?

Primero se crea un Makefile copiando la configuración de la lambda get-metrics y ajustando el nombre a authorizer [6:20]. Luego se sincronizan dependencias con go mod vendor y se sube el compilado a S3 con make publish.

En Terraform se crea un nuevo archivo authorizer.tf replicando la configuración de get-metrics pero reemplazando las referencias [6:50]. Se ejecuta terraform plan para verificar y terraform apply para desplegar.

¿Cómo se adjunta el authorizer en API Gateway?

Desde la consola de AWS, dentro de API Gateway, se va a Authorization y se selecciona Create and attach authorizer [7:40]:

  • Tipo: Lambda.
  • Nombre: "auth-get-metrics".
  • Función lambda: authorizer.
  • Formato del payload: versión 2.
  • Tipo de respuesta: IAM policy.

Para probarlo se genera un token en Auth0, se copia el valor de access_token y se pega en Postman como Bearer Token en el endpoint de get-metrics [8:10]. Si el token es válido, la respuesta será "hello from metrics". Si se modifica o elimina parte del token, el acceso es denegado, confirmando que la autorización con Auth0 funciona correctamente [8:50].

Con el authorizer validando tokens, el siguiente paso natural es conectar la lambda de get metrics a la base de datos para obtener métricas reales. ¿Has implementado authorizers de otra forma? Comparte tu experiencia en los comentarios.

      Authorizer Lambda con Auth0 y JWT