🔐 Autenticación en MiniTweet API
MiniTweet utiliza Spring Security junto con JWT (JSON Web Tokens) para autenticar a los usuarios y proteger los recursos de la API.
Así como hace uso de los roles y permisos para controlar el acceso a diferentes funcionalidades de la aplicación.
Esta configuración permite que solo los usuarios autenticados y con los permisos adecuados puedan acceder a ciertas rutas, realizar publicaciones o modificar datos.
🧠 ¿Cómo funciona?
- 🔒 Un usuario se registra o inicia sesión con su email y contraseña.
- 🧾 Si las credenciales son válidas, la API genera un JWT.
- 📦 Este token se envía al cliente y debe guardarse localmente.
- 🔐 Para acceder a rutas protegidas, el cliente debe enviar el token en el encabezado
Authorization
. - 🔍 La API valida el token y verifica los roles del usuario.
- ✅ Si el token es válido y el usuario tiene los permisos necesarios, se permite el acceso a la ruta solicitada.
🛡️ ¿Qué protege Spring Security?
-
Todas las rutas sensibles, como:
/posts
,/users
,/comments
, etc. -
Verifica automáticamente si el token JWT:
- Es válido
- No ha expirado
- Corresponde a un usuario real
- Comprueba los roles y permisos del usuario para cada solicitud.
- Permite el acceso solo a usuarios autenticados y autorizados.
🗂️ Dependencias clave
Tu proyecto utiliza las siguientes dependencias para manejar la seguridad:
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'io.jsonwebtoken:jjwt-api:0.12.5'
implementation 'io.jsonwebtoken:jjwt-impl:0.12.5'
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.5'
📜 Flujo de autenticación
- Registro de usuario: El usuario envía sus datos (email, contraseña) a la API.
- Generación de token: Si el registro es exitoso, se genera un JWT que contiene la información del usuario y sus roles.
- Almacenamiento del token: El cliente almacena el token en el almacenamiento local (localStorage, sessionStorage, etc.).
- Acceso a rutas protegidas: El cliente envía el token en el encabezado
Authorization
en cada solicitud a rutas protegidas. - Validación del token: La API verifica el token y extrae la información del usuario.
- Autorización: La API comprueba los roles del usuario para determinar si tiene permiso para acceder a la ruta solicitada.
- Respuesta: Si el token es válido y el usuario tiene los permisos necesarios, la API procesa la solicitud y devuelve la respuesta correspondiente.
sequenceDiagram
participant Cliente
participant API
Cliente->>API: POST /auth/login (email, contraseña)
API-->>Cliente: JWT Token
Cliente->>API: GET /posts (con token en header)
API-->>Cliente: Lista de posts (si el token es válido)
Cliente->>API: POST /posts (con token en header)
API-->>Cliente: Post creado (si el token es válido y tiene permisos)
✍️ Registro de usuarios
metodo: POST
ruta: /auth/register
Los usuarios pueden registrarse enviando una solicitud POST a /auth/register
con los siguientes datos:
{
"username": "username",
"email": "email@example.com",
"password": "password"
}
✅ Respuesta exitosa
HTTP/1.1 201 Created
{
"message": "User registered successfully",
"data": null
}
❌ Respuestas posibles errores
HTTP/1.1 400 Bad Request
{
"message": "Invalid input",
"data": {
"username": "Username is required",
"email": "Email is required",
"password": "Password is required"
}
}
HTTP/1.1 409 Conflict
{
"message": "User already exists, username or email is already taken",
"data": null
}
HTTP/1.1 500 Internal Server Error
{
"message": "An unexpected error occurred",
"data": null
}
🔑 Inicio de sesión
metodo: POST
ruta: /auth/login
Los usuarios pueden iniciar sesión enviando una solicitud POST a /auth/login
con los siguientes datos:
{
"identifier":"hernandex2",
"password":"12345"
}
✅ Respuesta exitosa
HTTP/1.1 200 OK
{
"message": "Login successful",
"data": {
"token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJmYWJpbzJAZ21haWwuY29tIiwiaWF0IjoxNzUyNDYzMjI3LCJleHAiOjE3NTYwNjMyMjd9.XdcoWN0VWruCjcKJszMbQS9Njcfl8srNPkCLUnJqi08"
}
}
❌ Respuestas posibles errores
HTTP/1.1 400 Bad Request
{
"message": "Invalid input",
"data": {
"identifier": "Identifier is required",
"password": "Password is required"
}
}
HTTP/1.1 401 Unauthorized
{
"message": "Invalid credentials",
"data": null
}
HTTP/1.1 500 Internal Server Error
{
"message": "An unexpected error occurred",
"data": null
}
🧪 Acceder a rutas protegidas
Para acceder a rutas protegidas, el cliente debe enviar el token JWT en el encabezado Authorization
de la siguiente manera:
Authorization: Bearer <token>
📆 Duración del token
Los tokens se configuran para expirar automáticamente después de cierto tiempo (ej. 24 horas).
Se define en application.properties
jwt.expiration=86400000 # 24 horas en milisegundos
🔐 Roles y permisos
MiniTweet usa control por roles para limitar el acceso:
Rol | Descripción |
---|---|
USER | Usuario normal, puede ver y publicar |
ADMIN | Acceso total: puede gestionar usuarios |
Los roles son validados automáticamente por Spring Security con anotaciones como @PreAuthorize("hasRole('ADMIN')").
📌 Notas importantes
✅ Guarda el token localmente (por ejemplo, en localStorage si usas frontend). ❌ No compartas tu token ni lo expongas en URLs. 🔁 Si el token expira, el usuario debe volver a iniciar sesión.
¿Te gustaría ver cómo manejar errores de autenticación o cómo construir filtros personalizados?
➡️ Revisa la sección de Manejo de Errores