Solicitar Restablecimiento de Contraseña
Envía un enlace de restablecimiento de contraseña a la dirección de email del usuario. Usa esto cuando los usuarios olvidan su contraseña.
Endpoint
POST /api/v1/auth/password-reset
Autenticación
No se requiere autenticación (endpoint público).
Request
Content-Type
application/json
Request Body
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
email | string | Sí | Dirección de email para enviar enlace de restablecimiento |
Ejemplo de Request
{
"email": "juan@ejemplo.com"
}
Response
Response Exitoso (200 OK)
{
"message": "Si el email existe, se ha enviado un enlace de restablecimiento de contraseña",
"success": true
}
Nota de Seguridad
El endpoint siempre devuelve éxito, incluso si el email no existe. Esto previene que atacantes descubran qué emails están registrados.
Ejemplos
curl -X POST https://api.callcov.com/api/v1/auth/password-reset \-H "Content-Type: application/json" \-d '{ "email": "juan@ejemplo.com"}'Flujo de Restablecimiento de Contraseña
- Usuario solicita restablecimiento → Este endpoint
- Backend envía email → Email con enlace de restablecimiento y token
- Usuario hace clic en enlace → Redirigido al frontend con token
- Usuario ingresa nueva contraseña → Frontend llama /auth/password-reset/confirm
- Contraseña actualizada → Usuario puede iniciar sesión con nueva contraseña
Contenido del Email
Los usuarios reciben un email que contiene:
- Enlace de restablecimiento de contraseña con token
- El enlace expira en 15 minutos
- El token es de un solo uso
Ejemplo de email:
Asunto: Restablece tu contraseña de CallCov
Haz clic en el enlace de abajo para restablecer tu contraseña:
https://app.callcov.com/reset-password-confirmation?token=abc123...
Este enlace expira en 15 minutos.
Si no solicitaste esto, puedes ignorar este email de forma segura.
Integración con Frontend
Formulario típico de "Olvidé mi Contraseña":
async function handleForgotPassword(email) {
try {
const response = await fetch('https://api.callcov.com/api/v1/auth/password-reset', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email })
});
if (response.ok) {
// Mostrar mensaje de éxito
alert('Si tu email está registrado, recibirás un enlace de restablecimiento de contraseña.');
}
} catch (error) {
console.error('Error:', error);
alert('Algo salió mal. Por favor intenta de nuevo.');
}
}
Limitación de Tasa
Para prevenir abuso:
- Máximo 3 requests por email por hora
- Máximo 10 requests por IP por hora
Comportamiento de Seguridad
Cuando este endpoint es llamado:
- Invalida todos los tokens de restablecimiento anteriores para este usuario
- Genera nuevo token de restablecimiento (expira en 15 minutos)
- Envía email de restablecimiento
- Siempre devuelve éxito (incluso si el email no existe)
Consideraciones de Seguridad
- Protección contra enumeración de emails: Siempre devuelve éxito
- Invalidación de tokens: Los tokens de restablecimiento anteriores se invalidan
- Tiempo limitado: Los tokens expiran en 15 minutos
- Un solo uso: Los tokens solo pueden usarse una vez
- Limitación de tasa: Previene bombardeo de emails
Pruebas en Desarrollo
En modo de desarrollo, los emails de restablecimiento se envían a MailHog (http://localhost:8025).
Problemas Comunes
Email No Recibido
Razones posibles:
- Email en carpeta de spam
- Dirección de email incorrecta
- Problema temporal del servicio de email
Solución: Esperar unos minutos, revisar spam, o intentar reenviar.
Límite de Tasa Excedido
{
"detail": "Demasiadas solicitudes de restablecimiento de contraseña. Por favor intenta de nuevo más tarde."
}
Solución: Esperar una hora antes de intentar de nuevo.
Ejemplo de Formulario de Restablecimiento Completo
function ForgotPasswordForm() {
const [email, setEmail] = useState('');
const [sent, setSent] = useState(false);
const [loading, setLoading] = useState(false);
const handleSubmit = async (e) => {
e.preventDefault();
setLoading(true);
try {
await fetch('https://api.callcov.com/api/v1/auth/password-reset', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email })
});
setSent(true);
} catch (error) {
alert('Algo salió mal. Por favor intenta de nuevo.');
} finally {
setLoading(false);
}
};
if (sent) {
return (
<div className="success-message">
<h2>Revisa tu email</h2>
<p>
Si tu email está registrado, recibirás un enlace de restablecimiento de contraseña
pronto.
</p>
<p>
¿No lo recibiste? Revisa tu carpeta de spam o intenta de nuevo en unos
minutos.
</p>
</div>
);
}
return (
<form onSubmit={handleSubmit}>
<h2>¿Olvidaste tu Contraseña?</h2>
<p>Ingresa tu email y te enviaremos un enlace de restablecimiento.</p>
<input
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="tu@email.com"
required
/>
<button type="submit" disabled={loading}>
{loading ? 'Enviando...' : 'Enviar Enlace de Restablecimiento'}
</button>
<a href="/login">Volver al Login</a>
</form>
);
}
Relacionado
- Confirmar Restablecimiento de Contraseña - Completar el restablecimiento con nueva contraseña
- Login - Iniciar sesión después del restablecimiento de contraseña
- Registrarse - Crear nueva cuenta