Saltar al contenido principal

Login

Autentica a un usuario con email y contraseña, y devuelve tokens de acceso y refresh.

Endpoint

POST /api/v1/auth/login

Autenticación

No se requiere autenticación (endpoint público).

Request

Content-Type

application/json

Request Body

CampoTipoRequeridoDescripción
emailstringDirección de email del usuario
passwordstringContraseña del usuario

Ejemplo de Request

{
"email": "juan@ejemplo.com",
"password": "ContraseñaSegura123!"
}

Response

Response Exitoso (200 OK)

{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer"
}

Campos del Response

CampoTipoDescripción
access_tokenstringToken de acceso JWT para requests de API (expira en 30 minutos)
refresh_tokenstringToken refresh JWT para obtener nuevos tokens de acceso (expira en 7 días)
token_typestringSiempre "bearer"

Ejemplos

curl -X POST https://api.callcov.com/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "juan@ejemplo.com",
"password": "ContraseñaSegura123!"
}'

Flujo de Login con Gestión de Tokens

import requests
from datetime import datetime, timedelta

class CallCovClient:
def __init__(self):
self.base_url = "https://api.callcov.com/api/v1"
self.access_token = None
self.refresh_token = None
self.token_expiry = None

def login(self, email, password):
"""Login y almacenar tokens"""
response = requests.post(
f"{self.base_url}/auth/login",
json={"email": email, "password": password}
)

if response.status_code == 200:
data = response.json()
self.access_token = data['access_token']
self.refresh_token = data['refresh_token']
# El token de acceso expira en 30 minutos
self.token_expiry = datetime.now() + timedelta(minutes=30)
return True
return False

def get_headers(self):
"""Obtener headers de autorización con refresh de token"""
# Refrescar token si expiró o expira pronto (dentro de 5 minutos)
if (self.token_expiry and
datetime.now() + timedelta(minutes=5) >= self.token_expiry):
self.refresh_access_token()

return {"Authorization": f"Bearer {self.access_token}"}

def refresh_access_token(self):
"""Refrescar el token de acceso"""
response = requests.post(
f"{self.base_url}/auth/refresh",
json={"refresh_token": self.refresh_token}
)

if response.status_code == 200:
data = response.json()
self.access_token = data['access_token']
self.refresh_token = data['refresh_token']
self.token_expiry = datetime.now() + timedelta(minutes=30)

# Uso
client = CallCovClient()
if client.login("juan@ejemplo.com", "ContraseñaSegura123!"):
# Hacer requests autenticados
response = requests.get(
f"{client.base_url}/users/me",
headers=client.get_headers()
)
print(response.json())

Errores

401 Unauthorized

Email o contraseña incorrectos:

{
"detail": "Email o contraseña incorrectos"
}

403 Forbidden

La cuenta de usuario está inactiva:

{
"detail": "La cuenta de usuario está inactiva"
}

Email no verificado:

{
"detail": "Por favor verificá tu dirección de email antes de iniciar sesión"
}

Verificaciones Pre-Login

Antes de permitir el login, la API verifica:

  1. Usuario existe: El email está registrado
  2. Contraseña correcta: La contraseña coincide con la contraseña hasheada
  3. Cuenta activa: is_active es true
  4. Email verificado: is_verified es true

Si alguna verificación falla, el login es rechazado.

Consideraciones de Seguridad

  • Contraseña nunca devuelta: Las contraseñas nunca se incluyen en los responses
  • Limitación de tasa: El endpoint de login tiene limitación de tasa para prevenir ataques de fuerza bruta
  • Bloqueo de cuenta: Después de 5 intentos fallidos, la cuenta se bloquea temporalmente (configurable)
  • Almacenamiento seguro de contraseñas: Las contraseñas se hashean con bcrypt
  • HTTPS requerido: Siempre usar HTTPS en producción

Expiración de Tokens

Tipo de TokenExpiraciónAcción Cuando Expira
Access Token30 minutosUsar token refresh para obtener uno nuevo
Refresh Token7 díasEl usuario debe iniciar sesión de nuevo

Usando Tokens de Acceso

Después del login, incluir el token de acceso en todos los requests autenticados:

curl https://api.callcov.com/api/v1/users/me \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

Integración con Frontend

Manejo típico de formulario de login:

async function handleLogin(email, password) {
try {
const response = await fetch('https://api.callcov.com/api/v1/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password })
});

if (!response.ok) {
const error = await response.json();
throw new Error(error.detail);
}

const { access_token, refresh_token } = await response.json();

// Almacenar tokens de forma segura
localStorage.setItem('access_token', access_token);
localStorage.setItem('refresh_token', refresh_token);

// Redirigir al dashboard
window.location.href = '/dashboard';
} catch (error) {
console.error('Login falló:', error.message);
alert(error.message);
}
}

Resolución de Problemas

"Por favor verificá tu dirección de email antes de iniciar sesión"

Solución: El usuario debe verificar su email primero. Puede:

  1. Revisar su email para el enlace de verificación
  2. Hacer clic en el enlace para verificar
  3. O usar reenviar verificación si no recibió el email

"La cuenta de usuario está inactiva"

Solución: Contactar a soporte - la cuenta ha sido desactivada.

"Email o contraseña incorrectos"

Solución:

Relacionado