Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/interezante456-pixel/Miercoles-Proyecto/llms.txt

Use this file to discover all available pages before exploring further.

El módulo de autenticación es el punto de entrada al sistema Tiendas Mi Cholo. No requiere ningún token previo — basta con enviar credenciales válidas para recibir un par de tokens JWT firmados con HMAC-SHA256. El access token expira en 24 horas y el refresh token en 7 días. Todas las demás rutas de la API exigen que el access token viaje en la cabecera Authorization: Bearer <token>.
/api/auth/** es la única ruta pública del sistema. Cualquier otra petición sin token válido recibirá 401 Unauthorized.

POST /api/auth/login

Autentica al usuario con username y contraseña, y retorna los tokens JWT junto con el perfil básico del usuario.

Request body

username
string
required
Nombre de usuario registrado en el sistema. Case-sensitive.
password
string
required
Contraseña del usuario. Se valida contra el hash BCrypt almacenado.

Response fields — 200 OK

token
string
Access token JWT firmado con HMAC-SHA256. Válido por 24 horas (86 400 000 ms). Incluye claims sub (username), roles y exp.
refreshToken
string
Refresh token JWT. Válido por 7 días (604 800 000 ms). Usar para obtener nuevos access tokens cuando el anterior expire.
username
string
Nombre de usuario autenticado.
nombre
string
Nombre de pila del usuario.
apellido
string
Apellido del usuario.
email
string
Correo electrónico registrado.
rol
string
Rol asignado al usuario. Uno de: ADMIN, VENDEDOR, ALMACENERO.

Claims del JWT

El payload del token decodificado contiene:
ClaimDescripción
subusername del usuario
rolesArray de roles p.ej. ["ROLE_ADMIN"]
iatTimestamp de emisión (epoch segundos)
expTimestamp de expiración (epoch segundos)

Ejemplo

curl -s -X POST http://localhost:8080/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "username": "admin",
    "password": "123456"
  }'
Respuesta 200 OK:
{
  "token": "eyJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJST0xFX0FETUlOIl0sInN1YiI6ImFkbWluIiwiaWF0IjoxNzA1MzEyMDAwLCJleHAiOjE3MDUzOTg0MDB9.Xv9kL2mN8pQrT5wY3hJ0oKdE7fGcBiAzWuVsSxMlRnI",
  "refreshToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTcwNTMxMjAwMCwiZXhwIjoxNzA1OTE2ODAwfQ.mPqL9sXzA2bGcNdKvRtYwH8oEfJ3iU0uC5aQlW7yZ4k",
  "username": "admin",
  "nombre": "Juan",
  "apellido": "Pérez",
  "email": "admin@tienda.com",
  "rol": "ADMIN"
}

Usar el token en peticiones subsecuentes

Una vez obtenido el token, inclúyelo como cabecera Authorization en cada llamada a rutas protegidas:
# Guardar el token en una variable de shell
TOKEN=$(curl -s -X POST http://localhost:8080/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"123456"}' \
  | grep -o '"token":"[^"]*"' | cut -d'"' -f4)

# Usar el token en una petición protegida
curl -s http://localhost:8080/api/usuarios \
  -H "Authorization: Bearer $TOKEN"
Almacena el token en localStorage o en el estado de tu aplicación front-end. Cuando recibas un 401 con mensaje de token expirado, usa el refreshToken para renovarlo sin pedir credenciales al usuario de nuevo.

Códigos de error

CódigoDescripciónCausa habitual
401 UnauthorizedCredenciales inválidasUsername o password incorrectos
400 Bad RequestValidación fallidaCampos username o password ausentes
Respuesta 401:
{
  "timestamp": "2024-01-15T10:30:00",
  "status": 401,
  "error": "Credenciales inválidas"
}
Respuesta 400 (campo faltante):
{
  "timestamp": "2024-01-15T10:30:00",
  "status": 400,
  "error": "Validación fallida",
  "campos": {
    "username": "must not be blank",
    "password": "must not be blank"
  }
}
Los tokens no se invalidan en el servidor al hacer logout desde el front-end. Si necesitas revocar acceso inmediatamente, cambia la contraseña del usuario desde /api/usuarios/{id} (requiere rol ADMIN).

Build docs developers (and LLMs) love