Saltar al contenido principal

Autenticación con JWT

Los JWT (JSON Web Tokens) se usan cuando tu aplicación tiene usuarios humanos que inician sesión. Cada usuario tiene su propio token, asociado a una empresa.


Flujo básico

1. Usuario introduce email + password
2. Tu app llama a POST /auth/login
3. Recibe access_token (JWT) + refresh_token
4. Guarda ambos tokens (memoria + almacenamiento seguro)
5. Envía Authorization: Bearer <access_token> en cada petición
6. Cuando el access_token caduca (8h), pide uno nuevo con el refresh_token

Login

POST /auth/login

POST /api/auth/login HTTP/1.1
Host: api.tpvready.es
Content-Type: application/json

{
"email": "admin@farmacia.es",
"password": "miPasswordSeguro123"
}

Respuesta (200):

{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer",
"expires_in": 28800,
"usuario": {
"token": "...",
"nombre": "Juan García",
"email": "admin@farmacia.es",
"rol": "admin"
}
}

Errores comunes:

CódigoCuándo
401Credenciales incorrectas
403Usuario suspendido o empresa bloqueada
422Email/password mal formados

Usar el access_token

Incluye la cabecera Authorization en cada petición:

GET /api/clientes HTTP/1.1
Host: api.tpvready.es
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Ejemplo Python

import requests

# Tras login
access_token = "eyJ..."

resp = requests.get(
"https://api.tpvready.es/api/clientes",
headers={"Authorization": f"Bearer {access_token}"},
)

Renovar el token (refresh)

El access_token caduca a las 8 horas. Antes de que expire (o cuando recibas un 401), usa el refresh_token para obtener uno nuevo sin volver a pedir las credenciales:

POST /auth/refresh

POST /api/auth/refresh HTTP/1.1
Host: api.tpvready.es
Content-Type: application/json

{
"refresh_token": "eyJ..."
}

Respuesta: mismo formato que login, con un nuevo access_token.


Otros endpoints públicos relacionados

EndpointPara qué
POST /auth/registroRegistrar empresa nueva
POST /auth/googleLogin/registro con Google Sign-In
GET /auth/verificar-emailValidar email tras registro
POST /auth/reset-passwordSolicitar email de reset
POST /auth/reset-password/confirmarEstablecer nueva contraseña con token de email
GET /auth/meDatos del usuario autenticado (requiere JWT)

Ver detalles y esquemas en la referencia interactiva.


Buenas prácticas

No bloquees el JWT en localStorage si tu app es una webapp expuesta a XSS. Usa cookies HttpOnly cuando sea posible.

Implementa refresh transparente. Cuando recibas un 401, intenta refresh automáticamente y reintenta la petición original. Solo redirige a login si el refresh también falla.

No reutilices tokens entre dispositivos/contextos. Cada sesión debe tener su propio par access/refresh.

Cierra sesión correctamente. En el lado cliente, simplemente borra los tokens. (El JWT seguirá siendo técnicamente válido hasta su expiración, pero ya no podrá usarse desde tu app.)

No mandes el JWT en URLs (?token=...). Va siempre en la cabecera Authorization.

No uses JWT para integraciones servidor-a-servidor. Para eso están las API Keys, que no caducan y no requieren un usuario humano.


Permisos del JWT

El JWT incluye el rol del usuario (admin, vendedor, contable, etc.). Los endpoints aplican estos permisos automáticamente:

  • Admin: acceso completo a su empresa.
  • Vendedor: ventas, clientes, TPV, productos (lectura).
  • Contable: facturas, contabilidad, tesorería.
  • Solo lectura: lectura de todo, sin escritura.

Si un usuario sin permisos intenta acceder a un endpoint restringido, recibe 403 Forbidden.

A diferencia de las API Keys con scopes, los permisos del JWT son fijos según el rol asignado en TPVReady; no se pueden personalizar por endpoint.