Documentación pública

02 · Autenticación JWT

MAG-02-AUTH · Autenticación JWT

Una identidad. Un token. Una empresa.

Toda petición autenticada a Roustix se realiza mediante JSON Web Token (JWT). El token identifica al usuario, la empresa (tenant) y el rol, evitando que el cliente tenga que enviar información sensible en cada solicitud.

La autenticación no solo valida quién es el usuario; también determina qué empresa está usando, qué módulos tiene activos y qué permisos posee.


1 · Flujo de autenticación

Login
   │
   ▼
Usuario + contraseña + empresa
   │
   ▼
Validación
   │
   ▼
JWT firmado
   │
   ▼
Cliente almacena token
   │
   ▼
Authorization: Bearer <token>
   │
   ▼
API Roustix

2 · Endpoint oficial

POST /api/v1/auth/login
Content-Type: application/json

Ruta actual (legacy): POST /api/auth/login

Request

{
  "username": "ana.garcia",
  "password": "********",
  "empresa_slug": "empresa-xyz"
}

Respuesta exitosa (200)

{
  "token": "<jwt>",
  "expires_in": 28800,
  "user": {
    "id": 15,
    "nombre": "Ana García",
    "rol": "admin"
  },
  "empresa": {
    "id": 4,
    "slug": "empresa-xyz",
    "nombre": "Empresa XYZ"
  }
}
CampoDescripción
tokenJWT firmado (ver §4)
expires_inSegundos hasta expiración (28800 = 8 h por defecto)
userIdentidad y rol del usuario
empresaTenant activo tras login

3 · Header estándar

Todas las solicitudes autenticadas utilizan:

Authorization: Bearer eyJhbGc...

JWT y API keys de integración se transportan como Bearer. El prefijo de la

credencial permite seleccionar el validador sin cambiar el header. No se

aceptan credenciales en query string ni Basic Auth. Las API keys se implementan

conforme al contrato de permisos de la plataforma.


4 · Parámetros de firma

ParámetroValor
AlgoritmoHS256
Firmaclave de firma del servidor
Expiración8 h por defecto · configurable
Clock skew±30 s recomendado

5 · Payload del JWT

El token contiene únicamente la información necesaria para identificar el contexto de operación.

CampoDescripciónObligatorio v1
subID del usuario
empresa_idEmpresa del usuario
empresa_slugIdentificador público de la empresa
rolRol principal
planPlan contratado (start, grow, scale, …)Sí*
modulesMódulos activos del tenantSí*
auth_versionVersión revocable de identidad
jtiIdentificador único del token
iatFecha de emisión (Unix timestamp)
nbfInicio de validez
expFecha de expiración (Unix timestamp)

Ejemplo

{
  "sub": 15,
  "empresa_id": 4,
  "empresa_slug": "empresa-xyz",
  "rol": "admin",
  "plan": "grow",
  "modules": ["maintenance", "inventory"],
  "iat": 1783670400,
  "exp": 1783756800
}

El servidor nunca confía en empresa_id enviado en query o body si contradice el token.

En cada petición, Roustix revalida auth_version, usuario activo, empresa, slug

y rol contra PostgreSQL. Cambiar contraseña, bloquear o mover al usuario revoca

inmediatamente los JWT emitidos anteriormente.

Claims reservados

Roustix reserva los siguientes claims para futuras versiones. No deben ser usados por integradores:

ClaimUso previsto
tenant_typeTipo de tenant (empresa, partner, sandbox)
permissionsPermisos granulares más allá del rol
localeLocale preferido del usuario
timezoneZona horaria IANA del tenant
featuresFeature flags activos

Esto evita romper el contrato cuando se añadan capacidades sin bump de versión JWT.


6 · Tiempo de vida y renovación

TokenDuraciónEstado
Access Token8 horas por defectoDisponible y revocable
Refresh Token7–30 días (por definir)Planificado (v2)

Refresh (contrato reservado)

POST /api/v1/auth/refresh
Content-Type: application/json

{
  "refresh_token": "<refresh_token>"
}

Estado: Planificado para una versión posterior (v2).

Respuesta prevista: nuevo token + expires_in sin reenviar credenciales.


7 · Códigos de respuesta

CódigoSignificado
200Login exitoso
400Solicitud inválida · username ambiguo sin empresa_slug
401Usuario o contraseña incorrectos
403Usuario suspendido o sin acceso · sin empresa asignada
429Demasiados intentos (5 / 15 min por IP)
500Error interno

Error estándar (auth)

{
  "error": {
    "code": "LOGIN_FAILED",
    "message": "Usuario o contraseña incorrectos"
  }
}

Formato completo de errores → MAG-06 · Manejo de errores.


8 · Cierre de sesión

POST /api/v1/auth/logout
Authorization: Bearer <token>

En la versión actual el cliente elimina el token almacenado. En futuras versiones podrá invalidarse mediante lista de revocación.


9 · Buenas prácticas

#Regla
1Nunca almacenar el JWT en URLs
2Utilizar siempre HTTPS en producción
3No incluir información confidencial en el payload
4Renovar el token al expirar (o vía refresh en MAG v2)
5El servidor valida firma y expiración en cada solicitud

10 · Seguridad

La autenticación no concede permisos por sí sola.

Después de validar el token, Roustix verifica:

  1. Que el usuario exista
  2. Que la empresa esté activa
  3. Que el plan permita el módulo solicitado
  4. Que el rol tenga permisos para la acción
  5. Que el recurso pertenezca al mismo tenant

Solo entonces se procesa la petición.


11 · Sesión web vs API

ModoUso
JWT BearerUsuario humano en clientes API
API key BearerServicios, ERP, BI y automatizaciones

API keys mediante un autenticador unificado sin ampliar el acceso de sesión web.


12 · Filosofía del capítulo

El JWT no solo identifica al usuario. Identifica el contexto completo de operación: empresa, plan, módulos y permisos. Cada solicitud a Roustix ocurre dentro de ese contexto.