Saltar al contenido principal

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

CampoTipoRequeridoDescripción
emailstringDirecció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

  1. Usuario solicita restablecimiento → Este endpoint
  2. Backend envía email → Email con enlace de restablecimiento y token
  3. Usuario hace clic en enlace → Redirigido al frontend con token
  4. Usuario ingresa nueva contraseña → Frontend llama /auth/password-reset/confirm
  5. 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:

  1. Invalida todos los tokens de restablecimiento anteriores para este usuario
  2. Genera nuevo token de restablecimiento (expira en 15 minutos)
  3. Envía email de restablecimiento
  4. 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:

  1. Email en carpeta de spam
  2. Dirección de email incorrecta
  3. 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