Añadiendo Autenticación JWT para Proteger la API - Episodio 12

En este post te voy a explicar lo que me encontré a la hora de implementar Autenticación JWT para proteger la API.
Otra piedra en el camino de montar una aplicación web usando a la IA como copiloto.
A ChatGPT como mi mejor amigo vaya.
📅 Diario de un SaaS: Añadiendo Autenticación JWT para Proteger la API
Así que a continuación te cuento en detalle todo:
🔑 La Pregunta del Millón: ¿Realmente Necesito Autenticación?
Al principio, ni siquiera me planteé añadir autenticación a la API.
“¿Quién va a querer hackear esto?”,
Pensé ingenuamente...
Pero cuando empecé a probar el CRUD en Postman, me di cuenta de que cualquiera podía hacer lo mismo… desde cualquier parte del mundo.
Si quería lanzar el producto como un negocio y no como ocio para pasar el rato, tenía que ponerme serio.
Es que claro, no necesitabas contraseña, ni permisos, ni nada.
Con solo saber la URL, podías ver, modificar o borrar cualquier pieza del almacén digital.
O sea, era como si hubiera dejado la puerta de casa abierta de par en par. 😅
Ahí fue cuando me di cuenta de que necesitaba proteger la API. Y no solo por seguridad, sino también para gestionar usuarios y permisos de manera correcta.
Pero...
¿Cómo hacerlo sin complicarlo todo?
Fue entonces cuando apareció JWT (JSON Web Tokens). La teoría sonaba bien, pero la práctica… fue otra historia. 🙈
Aunque si has seguido este Diario de un SaaS, sabrás que ya hice una breve implementación hace unos días...
Pero tenía que mejorarla!
Y mucho!
🔍 Problema: La Seguridad es un Dolor de Cabeza
Al principio, no quería complicarme la vida.
La idea era sencilla: proteger las rutas sensibles (crear, actualizar, eliminar) para que solo los usuarios autenticados pudieran acceder a ellas.
¿Qué tan difícil podía ser?
La respuesta: MUY DIFÍCIL.
¿Qué raro, no?
Cada paso me enfrentó a problemas que no había previsto:
Registro de Usuarios
Tenía que permitir que nuevos usuarios se registraran.
Pero, claro...
¿Cómo asegurarme de que no usaran nombres duplicados o contraseñas inseguras?
Inicio de Sesión con JWT:
La idea era generar un token para que el usuario pudiera autenticarse.
Pero...
¿Cómo gestiono la expiración de ese token?
¿Y si alguien roba el token? 😰
Protección de Rutas
Añadir @jwt_required() en las rutas críticas parecía fácil… hasta que dejó de funcionar sin razón aparente.
La primera vez, bloqueé todas las rutas, incluyendo la de inicio de sesión. 🤦♂️
O sea, tengo la sensación que cada vez que toco algo, la lío parda.
Manejo de Errores:
JWT lanzaba errores genéricos, sin pistas claras sobre qué estaba mal.
Estaba a punto de rendirme cuando encontré un artículo explicando cómo devolver errores personalizados.
¡Aleluya! 🙌
Conclusión
La verdad es que cada problema me hizo cuestionar la necesidad de usar JWT.
Es más, me preguntaba si no sería más fácil poner una contraseña en el frontend y olvidarme de tanto lío.
Pero seguí adelante, porque sabía que una API insegura no era una opción.
Y me encanta complicarme la vida! jaja
Eso sí, las noches de pelea con errores fueron épicas. 😤

🛠️ La Solución: Autenticación JWT sin Perder la Cabeza
Después de muchos intentos y errores, conseguí implementar JWT para proteger la API.
¿Cómo?
Con una combinación de perseverancia, búsquedas interminables en Google, estresar a ChatGPT y paciencia infinita.
Estas fueron las claves:
Registro de Usuarios con Bcrypt
Para almacenar contraseñas de forma segura, usé Bcrypt para encriptarlas antes de guardarlas en la base de datos.
Ahora, aunque alguien acceda a la base de datos, no podrá ver las contraseñas en texto plano.
¿Quién manda ahora?
Inicio de Sesión con Token JWT:
Implementé un endpoint /login que genera un access_token cuando el usuario se autentica correctamente.
Este token se envía en el encabezado de las peticiones para acceder a las rutas protegidas.
Protección de Rutas con @jwt_required()
Añadí este decorador en las rutas críticas (POST, PUT y DELETE en /parts) para asegurarme de que solo los usuarios autenticados pudieran crear, actualizar o eliminar piezas.
Imagina que no fuera así... menuda liada!
Gestión de Errores Personalizados
Configuré mensajes de error específicos para cuando el token es inválido, ha expirado o simplemente no está presente.
Así, el usuario sabe exactamente qué pasó.
(Y yo también)
Conclusión
Después de implementar todo esto, volví a probar la API en Postman… y
¡funcionó! 🎉
Fue duro pero muy gratificante!
💡 Lecciones Aprendidas
Te recopilo los diferentes aprendizajes de todo esto:
La Seguridad no es Opciona
Al principio no quería complicarme, pero ahora entiendo que proteger la API es fundamental.
No se trata solo de seguridad, sino también de profesionalidad y escalabilidad.
JWT es Potente, pero Complejo:
No basta con copiar ejemplos de internet.
Ni tampoco de utilizar ChatGPT en crudo...
Tienes que entender cómo funcionan los tokens, cómo expiran y cómo gestionarlos.
Y eso ChatGPT me ha ayudado mucho.
Pero claro, no con el primer resultado que me dió sinó como resultado de múltiples iteraciones hasta conseguirlo.
Bcrypt es Tu Amigo:
Encriptar contraseñas es esencial.
Y aunque es obvio, a veces las obviedades no lo son tanto, vaya.
Si lo piensas bien, no puedes darte el lujo de almacenar contraseñas en texto plano.
Y sobre todo lo aprendí esto leyendo historias de hacks épicos.
No Te Rindas en el Primer Error:
En más de una ocasión estuve tentado de abandonar JWT.
Y de enviarlo todo a la mierda...
Pero persistí...
Porque soy muy cabezón o porque ya que llevo un tiempo escribiendo estos posts no quería que pensaras que fracasé...
O bien por un poco de todo, pero al final....
Lo conseguí!
Y llegado a este punto, ahora no me imagino la API sin esta capa de seguridad. 💪
🚀 Próximo Paso: Seguridad Avanzada y Expiración de Tokens
La autenticación JWT funciona, pero todavía hay problemas por resolver.
¿Qué raro, no?
La expiración de tokens es uno de ellos.
No quiero forzar a los usuarios a iniciar sesión constantemente, pero tampoco quiero mantener tokens indefinidamente.
El siguiente paso en JWT es implementar Refresh Tokens para renovar el access_token de forma segura.
No tengo ni idea de cómo hacerlo, pero el Víctor del futuro ya lo solucionará!
Además, seguro que no será fácil. 😅
Y volveré a entrar en Caos, Drama, desesperación, pero lo conseguiré!
➡️ ¿Alguna vez te enfrentaste a problemas con autenticación JWT?
¡Cuéntamelo en los comentarios y hazme rabiar por implementarlo a la primera!
Si quieres conocer otros artículos parecidos a Añadiendo Autenticación JWT para Proteger la API - Episodio 12 puedes visitar la categoría Proyecto-IA.

Deja una respuesta