Token Refresh
Intercambia un token refresh por un nuevo token de acceso y token refresh. Usa esto para mantener sesiones de usuario sin requerir re-login.
Endpoint
POST /api/v1/auth/refresh
Autenticación
No se requiere autenticación, pero requiere token refresh válido.
Request
Content-Type
application/json
Request Body
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
refresh_token | string | Sí | Token refresh válido del login o refresh anterior |
Ejemplo de Request
{
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Response
Response Exitoso (200 OK)
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer"
}
Nuevos Tokens para Ambos
Este endpoint devuelve tanto un nuevo token de acceso como un nuevo token refresh. Siempre reemplaza ambos tokens en tu almacenamiento.
Campos del Response
| Campo | Tipo | Descripción |
|---|---|---|
access_token | string | Nuevo token de acceso JWT (expira en 30 minutos) |
refresh_token | string | Nuevo token refresh JWT (expira en 7 días) |
token_type | string | Siempre "bearer" |
Rotación de Tokens
Este endpoint implementa rotación de tokens refresh por seguridad:
- Cada refresh genera un NUEVO token refresh
- El token refresh viejo se invalida
- Siempre actualiza tu token refresh almacenado
Ejemplos
curl -X POST https://api.callcov.com/api/v1/auth/refresh \-H "Content-Type: application/json" \-d '{ "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}'Patrón de Auto-Refresh
Cliente Python con Auto-Refresh
import requests
from datetime import datetime, timedelta
import threading
class CallCovClient:
def __init__(self, access_token, refresh_token):
self.base_url = "https://api.callcov.com/api/v1"
self.access_token = access_token
self.refresh_token = refresh_token
self.token_expiry = datetime.now() + timedelta(minutes=30)
self.refresh_lock = threading.Lock()
def refresh_tokens(self):
"""Refrescar tokens de acceso y refresh"""
with self.refresh_lock:
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)
return True
return False
def get_headers(self):
"""Obtener headers de autorización, refrescando token si es necesario"""
# Refrescar si el token expira en menos de 5 minutos
if datetime.now() + timedelta(minutes=5) >= self.token_expiry:
if not self.refresh_tokens():
raise Exception("Error al refrescar token. Por favor inicia sesión de nuevo.")
return {"Authorization": f"Bearer {self.access_token}"}
def make_request(self, method, endpoint, **kwargs):
"""Hacer request autenticado con auto-refresh"""
headers = self.get_headers()
if 'headers' in kwargs:
kwargs['headers'].update(headers)
else:
kwargs['headers'] = headers
response = requests.request(
method,
f"{self.base_url}{endpoint}",
**kwargs
)
# Si 401, intentar refrescar token una vez y reintentar
if response.status_code == 401:
if self.refresh_tokens():
headers = self.get_headers()
kwargs['headers'] = headers
response = requests.request(
method,
f"{self.base_url}{endpoint}",
**kwargs
)
return response
# Uso
client = CallCovClient(access_token, refresh_token)
# Refresca automáticamente los tokens cuando es necesario
response = client.make_request('GET', '/users/me')
print(response.json())
Errores
401 Unauthorized
Token refresh inválido:
{
"detail": "Token refresh inválido"
}
Usuario no encontrado o inactivo:
{
"detail": "Usuario no encontrado o inactivo"
}
Cuándo Refrescar
Refrescá el token de acceso cuando:
- El token de acceso ha expirado (la API devuelve 401)
- El token de acceso va a expirar pronto (refresh preventivo)
- La aplicación se inicia (verificar si el token está expirado)
Mejores Prácticas
- Refresh Preventivo: Refrescar 5 minutos antes de la expiración
- Manejar Fallos: Si el refresh falla, redirigir al login
- Actualizar Almacenamiento: Siempre actualizar ambos tokens
- Seguridad de Hilos: Usar locks para prevenir intentos de refresh concurrentes
- Reintentar Una Vez: Si la API devuelve 401, intentar refrescar y reintentar una vez
Consideraciones de Seguridad
- Rotación de token refresh: Cada refresh invalida el token refresh viejo
- Expiración: Los tokens refresh expiran en 7 días
- Almacenamiento seguro: Almacenar tokens refresh de forma segura (cookies httpOnly recomendadas)
- Sin reutilización: Los tokens refresh viejos no pueden reutilizarse
Vida Útil del Token Refresh
| Evento | Vida Útil |
|---|---|
| Token creado | 7 días |
| Token usado para refresh | Inmediatamente invalidado, se emite uno nuevo |
| Token expirado | No puede refrescarse, el usuario debe iniciar sesión |
Relacionado
- Login - Obtener tokens iniciales
- Perfil de Usuario - Usar token de acceso para requests de API
- Primeros Pasos: Autenticación - Guía completa de autenticación