API de Autenticación
Endpoints para autenticación de usuarios, gestión de sesiones y cambio de contexto.
Validar Compañía
Verifica si existe un slug de compañía antes de mostrar el formulario de inicio de sesión.
/v1/auth/validate-companyParámetros de Consulta:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
slug | string | Sí | Slug de compañía a validar |
Ejemplo de Solicitud:
curl "https://api.console.solucao42.com.br/v1/auth/validate-company?slug=acme-corp"
Respuesta:
{
"exists": true
}
Iniciar Sesión
Autenticarse con email y contraseña.
/v1/auth/loginCuerpo de Solicitud:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
company_slug | string | Sí | Identificador de compañía |
email | string | Sí | Email del usuario |
password | string | Sí | Contraseña del usuario |
Ejemplo de Solicitud:
curl -X POST https://api.console.solucao42.com.br/v1/auth/login \
-H "Content-Type: application/json" \
-d '{
"company_slug": "acme-corp",
"email": "[email protected]",
"password": "SecurePassword123!"
}'
Respuesta: 200 OK
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expires_in": 604800,
"user": {
"_id": "507f1f77bcf86cd799439011",
"email": "[email protected]",
"name": "John Doe",
"company_id": "507f1f77bcf86cd799439012"
}
}
Errores:
| Estado | Código de Error | Descripción |
|---|---|---|
| 400 | INVALID_CREDENTIALS | Email o contraseña incorrectos |
| 403 | FORBIDDEN | Usuario no autorizado para esta compañía |
| 404 | COMPANY_NOT_FOUND | El slug de compañía no existe |
| 422 | VALIDATION_ERROR | Cuerpo de solicitud inválido |
Iniciar Sesión con Google
Autenticarse usando un token de Google OAuth.
/v1/auth/googleCuerpo de Solicitud:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
company_slug | string | Sí | Identificador de compañía |
google_token | string | Sí | Token de Google OAuth |
Ejemplo de Solicitud:
curl -X POST https://api.console.solucao42.com.br/v1/auth/google \
-H "Content-Type: application/json" \
-d '{
"company_slug": "acme-corp",
"google_token": "ya29.a0AfH6SMBx..."
}'
Respuesta: Igual que el inicio de sesión con email/contraseña.
Obtener Usuario Actual
Devuelve el perfil del usuario autenticado y el contexto actual.
/v1/auth/meHeaders:
| Header | Requerido | Descripción |
|---|---|---|
Authorization | Sí | Bearer <token> |
Ejemplo de Solicitud:
curl https://api.console.solucao42.com.br/v1/auth/me \
-H "Authorization: Bearer YOUR_TOKEN"
Respuesta: 200 OK
{
"user": {
"_id": "507f1f77bcf86cd799439011",
"email": "[email protected]",
"name": "John Doe",
"company_id": "507f1f77bcf86cd799439012"
},
"context": {
"company_id": "507f1f77bcf86cd799439012"
}
}
Errores:
| Estado | Código de Error | Descripción |
|---|---|---|
| 401 | UNAUTHORIZED | Token inválido o expirado |
Inicio de Sesión Sin Contraseña
Autenticarse usando un código temporal enviado por email.
Solicitar Código de Inicio de Sesión
/v1/auth/passwordless/requestCuerpo de Solicitud:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
company_slug | string | Sí | Identificador de compañía |
email | string | Sí | Email del usuario |
Respuesta: 200 OK con { "message": "..." }
Verificar Código de Inicio de Sesión
/v1/auth/passwordless/verifyCuerpo de Solicitud:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
company_slug | string | Sí | Identificador de compañía |
email | string | Sí | Email del usuario |
code | string | Sí | Código de 6 dígitos del email |
Respuesta: Igual que el inicio de sesión estándar.
Autenticación Multifactor (2FA)
Verificar Inicio de Sesión 2FA
Verifica un token TOTP durante el flujo de inicio de sesión.
/v1/auth/2fa/loginCuerpo de Solicitud:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
pending_2fa_token | string | Sí | Token de la respuesta inicial de inicio de sesión |
totp_token | string | No | Código de 6 dígitos |
backup_code | string | No | Código de recuperación de un solo uso |
Single Sign-On (SSO)
Iniciar Flujo SSO
Inicia la redirección al Proveedor de Identidad.
/v1/auth/sso/:company_slug/startParámetros de Consulta:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
redirect_uri | string | Sí | Dónde regresar después de la autenticación del IdP |
Respuesta: 200 OK con { "url": "https://idp.com/auth/..." }
Callback de SSO
Endpoint usado por el IdP para devolver al usuario a la plataforma.
/v1/auth/sso/:company_slug/callbackParámetros: Parámetros estándar de SAML o OIDC (code, state, SAMLResponse).
Cerrar Sesión
Finaliza la sesión actual.
/v1/auth/logoutHeaders:
| Header | Requerido | Descripción |
|---|---|---|
Authorization | No | Bearer <token> (opcional) |
Ejemplo de Solicitud:
curl -X POST https://api.console.solucao42.com.br/v1/auth/logout \
-H "Authorization: Bearer YOUR_TOKEN"
Respuesta: 200 OK
{
"success": true
}
El frontend debe eliminar el token del almacenamiento después de llamar a este endpoint.
Estructura del Token JWT
Cuando se decodifica, el payload del JWT contiene:
{
"sub": "507f1f77bcf86cd799439011",
"user_id": "507f1f77bcf86cd799439011",
"company_id": "507f1f77bcf86cd799439012",
"email": "[email protected]",
"is_owner": false,
"iss": "solucao42-console-api",
"aud": "https://console.solucao42.com.br",
"jti": "unique-token-id",
"iat": 1709216800,
"exp": 1709821600
}
| Claim | Descripción |
|---|---|
sub | Sujeto (ID de usuario) |
user_id | Identificador de usuario |
company_id | Identificador de compañía (tenant) |
email | Email del usuario |
is_owner | Si el usuario es propietario de la compañía |
iss | Emisor del token |
aud | Audiencia del token |
jti | ID único del token |
iat | Emitido en (timestamp Unix) |
exp | Expira en (timestamp Unix) |
Ejemplos de Código
- JavaScript
- cURL
async function login(companySlug, email, password) {
const response = await fetch('https://api.console.solucao42.com.br/v1/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ company_slug: companySlug, email, password }),
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error || 'Login failed');
}
const data = await response.json();
sessionStorage.setItem('s42_auth_token', data.token);
return data.user;
}
async function getMe(token) {
const response = await fetch('https://api.console.solucao42.com.br/v1/auth/me', {
headers: { 'Authorization': `Bearer ${token}` },
});
return response.json();
}
# Iniciar sesión
TOKEN=$(curl -s -X POST https://api.console.solucao42.com.br/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"company_slug":"acme","email":"[email protected]","password":"password"}' \
| jq -r '.token')
# Obtener usuario actual
curl -s https://api.console.solucao42.com.br/v1/auth/me \
-H "Authorization: Bearer $TOKEN" | jq
# Cerrar sesión
curl -s -X POST https://api.console.solucao42.com.br/v1/auth/logout \
-H "Authorization: Bearer $TOKEN"