Saltar al contenido principal

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

CampoTipoRequeridoDescripción
tokenstringToken de restablecimiento del enlace del email
new_passwordstringNueva 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:

  1. La contraseña es hasheada y actualizada
  2. El token de restablecimiento se marca como usado (no puede reutilizarse)
  3. Todos los otros tokens de restablecimiento para este usuario se invalidan
  4. Todos los códigos de verificación para restablecimiento de contraseña se invalidan

Vida Útil del Token

EventoVida Útil
Token creado15 minutos
Token usado exitosamenteInmediatamente invalidado
Token expiradoNo 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

  1. Usuario hace clic en "Olvidé mi Contraseña" en la página de login
  2. Usuario ingresa email
  3. Frontend llama POST /auth/password-reset
  4. Usuario recibe email con enlace de restablecimiento
  5. Usuario hace clic en enlace → Redirigido al frontend con token
  6. Usuario ingresa nueva contraseña (dos veces para confirmación)
  7. Frontend llama POST /auth/password-reset/confirm
  8. Contraseña es restablecida
  9. Usuario redirigido al login
  10. 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