Confirmar Restablecimiento de Contraseña
Completa el proceso de restablecimiento de contraseña configurando una nueva contraseña usando el token de restablecimiento del email.
Endpoint
POST /api/v1/auth/password-reset/confirm
Autenticación
No se requiere autenticación, pero requiere token de restablecimiento válido.
Request
Content-Type
application/json
Request Body
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
token | string | Sí | Token de restablecimiento del enlace del email |
new_password | string | Sí | Nueva contraseña (ver requisitos abajo) |
Requisitos de Contraseña
La nueva contraseña debe cumplir TODOS los siguientes criterios:
- Mínimo 8 caracteres de longitud
- Al menos una letra mayúscula (A-Z)
- Al menos una letra minúscula (a-z)
- Al menos un dígito (0-9)
- Al menos un carácter especial (!@#$%^&*(),.?":|<>)
Ejemplo de Request
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"new_password": "NuevaContraseñaSegura123!"
}
Response
Response Exitoso (200 OK)
{
"message": "Contraseña restablecida exitosamente",
"success": true
}
Después del restablecimiento exitoso, el usuario puede iniciar sesión con su nueva contraseña usando el endpoint de login.
Ejemplos
curl -X POST https://api.callcov.com/api/v1/auth/password-reset/confirm \-H "Content-Type: application/json" \-d '{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "new_password": "NuevaContraseñaSegura123!"}'Integración con Frontend
Flujo típico de confirmación de restablecimiento de contraseña:
// Usuario hace clic en enlace de restablecimiento: https://app.callcov.com/reset-password-confirmation?token=abc123...
function ResetPasswordForm() {
const [password, setPassword] = useState('');
const [confirmPassword, setConfirmPassword] = useState('');
const [success, setSuccess] = useState(false);
const [error, setError] = useState('');
// Extraer token de la URL
const urlParams = new URLSearchParams(window.location.search);
const token = urlParams.get('token');
const handleSubmit = async (e) => {
e.preventDefault();
setError('');
// Validar que las contraseñas coincidan
if (password !== confirmPassword) {
setError('Las contraseñas no coinciden');
return;
}
try {
const response = await fetch('https://api.callcov.com/api/v1/auth/password-reset/confirm', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
token,
new_password: password
})
});
if (response.ok) {
setSuccess(true);
// Redirigir al login después de 2 segundos
setTimeout(() => {
window.location.href = '/login';
}, 2000);
} else {
const data = await response.json();
setError(data.detail);
}
} catch (error) {
setError('Algo salió mal. Por favor intentá de nuevo.');
}
};
if (success) {
return (
<div className="success-message">
<h2>✅ ¡Contraseña Restablecida Exitosamente!</h2>
<p>Redirigiendo al login...</p>
</div>
);
}
return (
<form onSubmit={handleSubmit}>
<h2>Establecer Nueva Contraseña</h2>
<input
type="password"
placeholder="Nueva Contraseña"
value={password}
onChange={(e) => setPassword(e.target.value)}
required
minLength={8}
/>
<input
type="password"
placeholder="Confirmar Contraseña"
value={confirmPassword}
onChange={(e) => setConfirmPassword(e.target.value)}
required
minLength={8}
/>
{error && <div className="error">{error}</div>}
<button type="submit">Restablecer Contraseña</button>
<div className="password-requirements">
<p>La contraseña debe contener:</p>
<ul>
<li>Al menos 8 caracteres</li>
<li>Una letra mayúscula</li>
<li>Una letra minúscula</li>
<li>Un número</li>
<li>Un carácter especial (!@#$%^&*...)</li>
</ul>
</div>
</form>
);
}
Errores
400 Bad Request
Token de restablecimiento inválido o expirado:
{
"detail": "Token de restablecimiento inválido o expirado"
}
El token de restablecimiento ha expirado:
{
"detail": "El token de restablecimiento ha expirado"
}
La contraseña no cumple los requisitos:
{
"detail": [
{
"loc": ["body", "new_password"],
"msg": "La contraseña debe contener al menos una letra mayúscula",
"type": "value_error"
}
]
}
404 Not Found
Usuario no encontrado (el token era válido pero el usuario fue eliminado):
{
"detail": "Usuario no encontrado"
}
Comportamiento de Seguridad
Cuando este endpoint es llamado exitosamente:
- La contraseña es hasheada y actualizada
- El token de restablecimiento se marca como usado (no puede reutilizarse)
- Todos los otros tokens de restablecimiento para este usuario se invalidan
- Todos los códigos de verificación para restablecimiento de contraseña se invalidan
Vida Útil del Token
| Evento | Vida Útil |
|---|---|
| Token creado | 15 minutos |
| Token usado exitosamente | Inmediatamente invalidado |
| Token expirado | No puede usarse |
Si el token expira, el usuario debe solicitar uno nuevo vía restablecimiento de contraseña.
Validación de Contraseña
Las contraseñas se validan para:
- Longitud: Mínimo 8 caracteres
- Mayúscula: Al menos una (A-Z)
- Minúscula: Al menos una (a-z)
- Dígito: Al menos uno (0-9)
- Especial: Al menos uno (!@#$%^&*(),.?":|<>)
Ejemplos de contraseñas válidas:
ContraseñaSegura123!MiC0ntr@señ@C0mpl3j!dad
Ejemplos de contraseñas inválidas:
password(sin mayúscula, sin dígito, sin carácter especial)PASSWORD123(sin minúscula, sin carácter especial)Pass!(muy corta)
Flujo Completo de Restablecimiento de Contraseña
- Usuario hace clic en "Olvidé mi Contraseña" en la página de login
- Usuario ingresa email
- Frontend llama POST /auth/password-reset
- Usuario recibe email con enlace de restablecimiento
- Usuario hace clic en enlace → Redirigido al frontend con token
- Usuario ingresa nueva contraseña (dos veces para confirmación)
- Frontend llama POST /auth/password-reset/confirm
- Contraseña es restablecida
- Usuario redirigido al login
- Usuario inicia sesión con nueva contraseña
Consideraciones de Seguridad
- Tokens de un solo uso: Cada token solo puede usarse una vez
- Tiempo limitado: Los tokens expiran en 15 minutos
- Hashing de contraseñas: Las contraseñas nunca se almacenan en texto plano
- Invalidación de tokens: Usar un token invalida todos los otros tokens de restablecimiento
- Contraseña fuerte requerida: Aplica reglas de complejidad de contraseña
Relacionado
- Solicitar Restablecimiento de Contraseña - Enviar email de restablecimiento
- Login - Iniciar sesión después del restablecimiento
- Registrarse - Crear nueva cuenta