Verificar código SMS
Endpoint: POST /auth/phone/verify
Permite verificar el código SMS recibido después de registrar un número telefónico, completando el proceso de verificación telefónica.
🔐 Requiere autenticación JWT
Debes enviar un token JWT válido en el header:
Authorization: Bearer <accessToken>
📝 Cuerpo de la solicitud
{
"sessionId": "phone-session-uuid",
"code": "123456"
}
Parámetros:
- sessionId: ID de sesión recibido de
/auth/phone/register - code: Código de 6 dígitos recibido por SMS
📋 Respuestas
✅ 200 OK
-
Verificación exitosa
{
"code": 1001,
"message": "Phone verified successfully",
"data": {
"phoneVerified": true,
"verifiedAt": "2025-01-20T14:45:00.000Z",
"phoneNumber": "543513391269"
}
}
❌ 400 Bad Request
-
Código SMS incorrecto
{
"code": 4005,
"message": "Invalid verification code",
"details": {
"attemptsRemaining": 2,
"maxAttempts": 3
}
} -
SessionId inválido o expirado
{
"code": 4006,
"message": "Invalid or expired session ID"
} -
Código expirado
{
"code": 4007,
"message": "Verification code has expired"
} -
Faltan campos requeridos
{
"message": "Session ID is required"
}{
"message": "Verification code is required"
}
❌ 429 Too Many Requests
-
Demasiados intentos fallidos
{
"code": 4030,
"message": "Too many failed attempts. Request a new code.",
"details": {
"cooldownMinutes": 5
}
}
❌ 401 Unauthorized
-
Sin token válido
{
"statusCode": 401,
"message": "Unauthorized"
}
🔒 Sistema de intentos
Límites de verificación
- Máximo de intentos: 3 intentos por código SMS
- Cooldown: 5 minutos después de agotar los intentos
- Expiración: Los códigos expiran en 10 minutos
Comportamiento de intentos
- Primer intento fallido: Se permite continuar
- Segundo intento fallido: Se advierte al usuario
- Tercer intento fallido: Se bloquea temporalmente
- Después del cooldown: Se debe solicitar un nuevo código
📱 Efectos de la verificación exitosa
Actualización del perfil
- Se marca el número como verificado en el perfil del usuario
- Se actualiza la fecha de verificación telefónica
- Se habilitan funciones que requieren teléfono verificado
Funcionalidades desbloqueadas
- Recuperación por SMS: Opciones adicionales de recuperación de cuenta
- Notificaciones SMS: Alertas de seguridad por mensaje de texto
- Verificación en dos pasos: SMS como método 2FA alternativo
- Operaciones sensibles: Confirmación adicional por SMS
🔄 Flujo completo de verificación
- Solicitar verificación:
POST /auth/phone/registercon número - Recibir SMS: Código de 6 dígitos enviado al teléfono
- Verificar código: Usar este endpoint con sessionId y código
- Confirmación: Número queda verificado en el perfil del usuario
📝 Notas
- El
sessionIddebe ser exactamente el recibido de/auth/phone/register - Los códigos son case-insensitive pero deben ser exactos
- Una verificación exitosa es permanente hasta que se cambie el número
- Si se agotan los intentos, se debe solicitar un nuevo código
🛡️ Características de seguridad
Protección contra ataques
- Rate limiting: Límites estrictos de intentos por sesión
- Expiración automática: Códigos y sesiones con tiempo limitado
- Cooldown periods: Prevención de ataques de fuerza bruta
- Auditoría completa: Logs de todos los intentos de verificación
Validaciones
- Formato de código: Solo 6 dígitos numéricos
- Unicidad de sesión: Una sesión por solicitud de verificación
- Timeouts: Expiración automática de códigos y sesiones
🔗 Endpoints relacionados
/auth/phone/register- Solicitar código SMS/auth/login- Login que puede incluir verificación telefónica adicional
⚡ Consejos de implementación
Interfaz de usuario
- Mostrar intentos restantes en la UI
- Proporcionar opción para solicitar nuevo código
- Implementar timer visual para expiración
- Autocompletar código desde SMS si es posible
Manejo de errores
if (response.code === 4005) {
// Código incorrecto, mostrar intentos restantes
showError(`Código incorrecto. ${response.details.attemptsRemaining} intentos restantes.`);
} else if (response.code === 4030) {
// Demasiados intentos, mostrar cooldown
showError(`Demasiados intentos. Intenta de nuevo en ${response.details.cooldownMinutes} minutos.`);
}
Requisito previo: Debes haber obtenido un
sessionIdválido de/auth/phone/registerantes de usar este endpoint.