Apariencia
Registro y verificación
Todo candidato en HUMAE pasa por un registro auto-servicio con verificación de correo obligatoria antes de operar.
¿Eres reclutador o empresa?
Esta página describe el flujo de candidatos, que es self-service y se activa al verificar el correo. Si quieres registrarte como reclutador o como empresa, ese flujo requiere aprobación de un admin y vive en sus propias páginas: Registro de reclutador → · Registro de empresa →.
Paso 1 · Formulario de registro
URL: /register → tarjeta "Soy candidato" → /register/candidato
Campos requeridos (schema Zod en src/schemas/auth.ts):
| Campo | Validación |
|---|---|
name | Requerido, 1–120 caracteres |
email | Requerido, formato email válido, único en la tabla users |
phone | Opcional, 10–20 caracteres, solo dígitos y + ( ) - |
password | Requerido, 8+ caracteres, al menos 1 letra y 1 número |
password_confirmation | Debe coincidir con password |
accept_terms | Checkbox obligatorio |
Si el correo ya existe, el backend devuelve 422 con errors.email = ["Este correo ya está registrado"].
Endpoint: POST /api/v1/auth/registerRate limit: 10 por minuto por IP.
Paso 2 · Envío del correo de verificación
Inmediatamente después del registro exitoso:
- El backend crea el
Userconstatus = pending_verification. - Le asigna el rol
candidate(Spatie Permission). - Genera una URL firmada con expiración de 60 minutos (
VerifyEmail::createUrlUsing). - Dispara la notificación
VerifyEmailque envía un correo vía el SMTP local (Postfix en el mismo servidor). - El candidato recibe: "Verifica tu correo para activar tu cuenta HUMAE".
Rol asignado
El rol candidate queda asignado desde el registro. No requiere aprobación manual.
Paso 3 · Verificación del correo
El link del correo apunta a /verify-email?id=123&hash=<sha1>&expires=<timestamp>&signature=<hmac>.
- El frontend recibe los parámetros, hace
POST /api/v1/auth/verify-emailcon ellos. - Si la firma HMAC es válida y no ha expirado, el backend marca
email_verified_at = now(). - El
statusdel user pasa aactive. - Se redirige al candidato a
/logincon un toast de confirmación.
Si el link expiró:
- El candidato puede pedir reenvío en
/verify-email→ input del correo →POST /api/v1/auth/verify-email/resend. - Rate limit: 3 por minuto por IP.
Paso 4 · Primer inicio de sesión
URL: /login
Se llama POST /api/v1/auth/login con {email, password}. El backend ejecuta dos compuertas en orden tras validar credenciales y devuelve un errors.code específico para que el frontend muestre el toast adecuado:
| Estado | Status | errors.code | UX |
|---|---|---|---|
Credenciales OK + email verificado + status active | 200 | — | {user, token} y redirect según rol |
| Email NO verificado | 403 | email_unverified | Toast con CTA "Reenviar correo de verificación" |
Email verificado, status=pending_approval | 403 | pending_approval | Toast "Tu cuenta está en revisión" (aplica a reclutadores y empresas, no a candidatos) |
Email verificado, status ∈ {suspended, inactive} | 403 | account_inactive | Toast "Tu cuenta está inactiva. Contacta a soporte" |
| Credenciales incorrectas | 422 | — | "Las credenciales no coinciden con nuestros registros" |
Rate limit login: 5 por minuto por IP + email.
Paso 5 · Estado inicial en el dashboard
Al entrar por primera vez, el candidato ve su dashboard con un checklist de onboarding:
☐ Completa tu perfil básico
☐ Sube tu foto de perfil
☐ Agrega al menos 1 experiencia
☐ Agrega al menos 1 educación
☐ Agrega al menos 3 habilidades
☐ Contrata tu membresía
☐ Completa las pruebas psicométricas requeridasHasta que todos los ítems estén marcados, el candidato NO aparece en el directorio para los recruiters.
Recuperación de contraseña
Si el candidato olvida su contraseña:
- Va a
/forgot-password, escribe su correo →POST /api/v1/auth/forgot-password. - Rate limit: 5 por minuto.
- El backend genera un token y envía correo con URL
/reset-password?token=...&email=.... - El candidato entra al link, escribe nueva contraseña →
POST /api/v1/auth/reset-password. - El backend revoca todos los tokens Sanctum activos del usuario (seguridad) y actualiza el hash.
- Confirmación por email + redirección a
/login.
Cierre de sesión
POST /api/v1/auth/logoutrevoca el token Sanctum actual.- El frontend llama
setAuthToken(null)y limpia Zustand. - Redirige a
/login.
Notificaciones relacionadas
| Evento | Canal | Plantilla |
|---|---|---|
| Registro exitoso | VerifyEmail.php | |
| Verificación de correo | WelcomeNotification.php | |
| Contraseña reseteada | ResetPasswordNotification.php | |
| Nuevo login desde IP desconocida | Email (opcional) | Fase 2 |
Errores comunes
| Error | Causa | Solución |
|---|---|---|
| "Este correo ya está registrado" | Ya existe un User con ese email | Usar Recuperar contraseña |
| "La contraseña debe tener al menos 8 caracteres…" | Schema Zod falló | Cumplir con los requisitos |
| "Link de verificación expirado" | Pasaron 60 min | Reenviar correo |
| "Demasiados intentos" | Hit rate limit | Esperar 60 segundos |
Siguiente
Ya verificado y logueado, el candidato debe contratar su membresía para ser visible en el directorio. Membresía y pago →

