Autenticación
La API de JAAK Signa utiliza autenticación basada en tokens JWT (JSON Web Tokens). Esta guía describe los endpoints para obtener, renovar y revocar tokens de acceso.
Flujo de autenticación
1. POST /sign-in → Obtener token y refreshToken
2. Usar token en header Authorization: Bearer TOKEN
3. Cuando expire → POST /refresh-token con refreshToken
4. Al cerrar sesión → POST /sign-out
Duración de tokens
- Token de acceso: 1 hora (3600 segundos)
- Refresh token: 7 días
Iniciar sesión
/api/v1/sign-inAutentica un usuario y devuelve tokens de acceso
Parámetros del body
| Nombre | Tipo | Requerido | Descripcion |
|---|---|---|---|
email | string | Email del usuario registrado en JAAK Signa | |
password | string | Contraseña del usuario |
Ejemplo de solicitud
curl -X POST https://signa.dev.jaak.ai/api/v1/sign-in \
-H "Content-Type: application/json" \
-d '{
"email": "usuario@empresa.com",
"password": "tu-contraseña-segura"
}'
Respuesta exitosa (200 OK)
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c3JfYWJjMTIzIiwiZW1haWwiOiJ1c3VhcmlvQGVtcHJlc2EuY29tIiwiaWF0IjoxNzA1MzE0MjAwLCJleHAiOjE3MDUzMTc4MDB9.signature",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c3JfYWJjMTIzIiwidHlwZSI6InJlZnJlc2giLCJpYXQiOjE3MDUzMTQyMDAsImV4cCI6MTcwNTkxOTAwMH0.signature",
"expiresIn": 3600,
"user": {
"id": "usr_abc123",
"email": "usuario@empresa.com",
"name": "Usuario Ejemplo",
"organizationId": "org_xyz789"
}
}
Errores
| Código | Descripción | |--------|-------------| | 400 | Parámetros inválidos (email o password faltantes) | | 401 | Credenciales incorrectas | | 403 | Cuenta suspendida o deshabilitada | | 429 | Demasiados intentos. Espera antes de reintentar |
Ejemplo de error (401)
{
"error": {
"code": "INVALID_CREDENTIALS",
"message": "Email o contraseña incorrectos",
"status": 401
}
}
Límite de intentos
Después de 5 intentos fallidos, la cuenta se bloquea temporalmente por 15 minutos. Implementa un mecanismo de backoff exponencial en tu integración.
Renovar token
/api/v1/refresh-tokenRenueva el token de acceso usando el refresh token
Usa este endpoint cuando el token de acceso expire para obtener uno nuevo sin pedir credenciales al usuario.
Parámetros del body
| Nombre | Tipo | Requerido | Descripcion |
|---|---|---|---|
refreshToken | string | Refresh token obtenido en el sign-in |
Ejemplo de solicitud
curl -X POST https://signa.dev.jaak.ai/api/v1/refresh-token \
-H "Content-Type: application/json" \
-d '{
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}'
Respuesta exitosa (200 OK)
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.nuevo-token...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.nuevo-refresh...",
"expiresIn": 3600
}
Rotación de tokens
Cada vez que usas el refresh token, recibes un nuevo par de tokens. El refresh token anterior queda invalidado. Esto mejora la seguridad al limitar la ventana de uso de tokens comprometidos.
Errores
| Código | Descripción | |--------|-------------| | 400 | Refresh token faltante o malformado | | 401 | Refresh token inválido o expirado | | 403 | Refresh token revocado (sesión cerrada) |
Cerrar sesión
/api/v1/sign-outBearer TokenRevoca los tokens y cierra la sesión
Revoca el token de acceso actual y su refresh token asociado. Todos los tokens emitidos para esta sesión dejarán de funcionar.
Headers
| Header | Valor | |--------|-------| | Authorization | Bearer YOUR_TOKEN |
Ejemplo de solicitud
curl -X POST https://signa.dev.jaak.ai/api/v1/sign-out \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
Respuesta exitosa (200 OK)
{
"message": "Sesión cerrada exitosamente"
}
Errores
| Código | Descripción | |--------|-------------| | 401 | Token de acceso inválido o expirado |
Sesiones múltiples
Si el usuario tiene sesiones activas en múltiples dispositivos, este endpoint solo cierra la sesión actual. Para cerrar todas las sesiones, usa POST /api/v1/sign-out-all.
Uso del token
Una vez obtenido el token, inclúyelo en el header Authorization de todas las solicitudes:
curl -X GET https://signa.dev.jaak.ai/api/v1/templates \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
Estructura del token JWT
El token contiene la siguiente información (decodificada):
{
"sub": "usr_abc123",
"email": "usuario@empresa.com",
"organizationId": "org_xyz789",
"permissions": ["templates:read", "templates:write", "submissions:*"],
"iat": 1705314200,
"exp": 1705317800
}
| Campo | Descripción | |-------|-------------| | sub | ID único del usuario | | email | Email del usuario | | organizationId | ID de la organización | | permissions | Lista de permisos del usuario | | iat | Timestamp de emisión (issued at) | | exp | Timestamp de expiración |
Manejo de errores de autenticación
Implementa esta lógica en tu integración:
async function apiCall(endpoint, options) {
const response = await fetch(endpoint, {
...options,
headers: {
...options.headers,
'Authorization': `Bearer ${getToken()}`
}
});
if (response.status === 401) {
// Token expirado, intentar renovar
const newTokens = await refreshTokens();
if (newTokens) {
// Reintentar la solicitud original
return apiCall(endpoint, options);
} else {
// Refresh token también expiró, redirigir a login
redirectToLogin();
}
}
return response;
}
Siguientes pasos
- Guía rápida - Implementa tu primera firma
- Tipos de firma - Conoce las opciones disponibles
- Errores - Catálogo completo de códigos de error