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

JWT para Proteger la API

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.

Índice
  1. 📅 Diario de un SaaS: Añadiendo Autenticación JWT para Proteger la API
    1. 🔑 La Pregunta del Millón: ¿Realmente Necesito Autenticación?
  2. 🔍 Problema: La Seguridad es un Dolor de Cabeza
    1. Registro de Usuarios
    2. Inicio de Sesión con JWT:
    3. Protección de Rutas
    4. Manejo de Errores:
    5. Conclusión
  3. 🛠️ La Solución: Autenticación JWT sin Perder la Cabeza
    1. Registro de Usuarios con Bcrypt
    2. Inicio de Sesión con Token JWT:
    3. Protección de Rutas con @jwt_required()
    4. Gestión de Errores Personalizados
    5. Conclusión
  4. 💡 Lecciones Aprendidas
    1. La Seguridad no es Opciona
    2. JWT es Potente, pero Complejo:
    3. Bcrypt es Tu Amigo:
    4. No Te Rindas en el Primer Error:
  5. 🚀 Próximo Paso: Seguridad Avanzada y Expiración de Tokens

📅 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. 😤

JWT para Proteger la API DiariodeunSaaS


🛠️ 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

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir