Protege tu API de Express.js con JWT y Logto
Aprende a proteger los endpoints de tu API de Express.js con JSON Web Tokens (JWT) y Logto.
Introducción
Cuando estás desarrollando una aplicación web, es crucial proteger tus endpoints de API contra accesos no autorizados. Imagina que estás construyendo un sitio web de compras en línea; definitivamente no quieres que ciber ladrones aprovechen tu API.
Suponiendo que ya has construido una aplicación de Express.js con autenticación de usuario, donde los usuarios deben iniciar sesión antes de realizar ciertas acciones. Si no es así, puedes empezar tu viaje con Logto. Solo requiere unas pocas líneas de código para establecer un flujo de autenticación de usuario.
Sin embargo, incluso después de la autenticación de usuario, te enfrentas a varias opciones para proteger tus endpoints de API. Desafortunadamente, la mayoría de estas opciones tienen sus desventajas:
- Autenticación basada en sesiones: Vincular tu API a un almacén de sesiones, lo cual no es escalable y no se adapta bien a microservicios.
- Llamar a un servicio de autenticación: Esto introduce una llamada de red adicional, aumentando la latencia y los costos. Algunos servicios de autenticación incluso cobran según el volumen de llamadas a la API, lo que puede llevar a gastos elevados.
En este tutorial, demostraremos cómo reforzar tus endpoints de API usando JSON Web Tokens (JWT) y Logto. Este enfoque ofrece escalabilidad y costos adicionales mínimos.
Requisitos previos
Antes de comenzar, asegúrate de tener lo siguiente:
- Una cuenta de Logto. Si no tienes una, puedes registrarte gratis.
- Un proyecto de Express.js que necesite protección de la API y una aplicación cliente que consuma la API.
- Familiaridad básica con JSON Web Token (JWT).
Define tu recurso de API en Logto
Logto aprovecha al máximo RFC 8707: Indicadores de Recursos para OAuth 2.0 para asegurar tus endpoints de API. Esto significa que puedes definir tus recursos de API usando sus URLs reales.
Navega a la pestaña "Recursos de API" en la Consola de Logto y haz clic en "Crear recurso de API" para crear uno nuevo. Por ejemplo, si deseas proteger el endpoint /api/products
, puedes usar la URL https://tudominio.com/api/products
como el identificador.
Obtén un token de acceso en tu aplicación cliente
Para continuar, necesitarás integrar el SDK de Logto en tu aplicación cliente. Esta aplicación podría diferir de tu backend de Express.js; por ejemplo, podrías tener una aplicación React usando Express.js como el servidor API del backend.
También necesitarás ajustar la configuración del SDK de Logto para informar a Logto que deseas solicitar un token de acceso para tu API en este flujo. Aquí tienes un ejemplo usando React:
Una vez que un usuario inicia sesión con Logto, isAuthenticated
dentro del SDK de Logto se convertirá en true
:
Ahora, puedes usar el método getAccessToken
para recuperar un token de acceso para tu API:
Finalmente, incluye este token de acceso en el encabezado Authorization
al hacer solicitudes a tu API:
Verifica el token de acceso en tu API
En tu aplicación de Express.js, instala la librería jose
para la verificación de JWT:
Como estamos usando autenticación Bearer, extrae el token de acceso del encabezado Authorization
:
Posteriormente, crea un middleware para verificar el token de acceso:
Ahora puedes emplear este middleware para proteger tus endpoints de API:
Con este enfoque, no necesitas contactar al servidor Logto cada vez que llega una solicitud. En su lugar, obtienes el Conjunto de Claves Web de JSON (JWKS) del servidor Logto una vez y posteriormente verificas los tokens de acceso localmente.
Control de acceso basado en roles
Hasta este punto, solo hemos verificado que un usuario ha iniciado sesión con Logto. Aún no sabemos si el usuario posee el permiso adecuado para acceder al endpoint de API. Esto se debe a que Logto permite que cualquiera obtenga un token de acceso para un recurso de API existente.
Para abordar esto, podemos emplear el control de acceso basado en roles (RBAC). En Logto, puedes definir roles y asignar permisos a ellos. Consulta este tutorial para aprender cómo definir roles y permisos en Logto.
Después de definir roles y permisos, puedes agregar la opción scopes
al componente LogtoProvider
:
Logto solo emitirá un token de acceso con el(los) alcance(s) apropiado(s) al usuario. Por ejemplo, si un usuario solo tiene el alcance read:products
, el token de acceso solo contendrá ese alcance:
Si un usuario tiene ambos alcances read:products
y write:products
, el token de acceso contendrá ambos alcances con un espacio como delimitador:
En tu aplicación de Express.js, puedes verificar si el token de acceso contiene el(los) alcance(s) correcto(s) antes de otorgar acceso al endpoint de API:
Conclusión
Proteger los endpoints de API mientras se garantiza la escalabilidad no es una hazaña pequeña. En Logto, nos esforzamos por simplificar la autenticación de solicitudes para los desarrolladores, permitiéndote concentrarte más en tu lógica de negocio.
Para cualquier pregunta, no dudes en unirte a nuestro servidor de Discord. Nuestra comunidad siempre está feliz de asistirte.