Skip to content

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):

CampoValidación
nameRequerido, 1–120 caracteres
emailRequerido, formato email válido, único en la tabla users
phoneOpcional, 10–20 caracteres, solo dígitos y + ( ) -
passwordRequerido, 8+ caracteres, al menos 1 letra y 1 número
password_confirmationDebe coincidir con password
accept_termsCheckbox 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:

  1. El backend crea el User con status = pending_verification.
  2. Le asigna el rol candidate (Spatie Permission).
  3. Genera una URL firmada con expiración de 60 minutos (VerifyEmail::createUrlUsing).
  4. Dispara la notificación VerifyEmail que envía un correo vía el SMTP local (Postfix en el mismo servidor).
  5. 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-email con ellos.
  • Si la firma HMAC es válida y no ha expirado, el backend marca email_verified_at = now().
  • El status del user pasa a active.
  • Se redirige al candidato a /login con 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:

EstadoStatuserrors.codeUX
Credenciales OK + email verificado + status active200—{user, token} y redirect según rol
Email NO verificado403email_unverifiedToast con CTA "Reenviar correo de verificación"
Email verificado, status=pending_approval403pending_approvalToast "Tu cuenta está en revisión" (aplica a reclutadores y empresas, no a candidatos)
Email verificado, status ∈ {suspended, inactive}403account_inactiveToast "Tu cuenta está inactiva. Contacta a soporte"
Credenciales incorrectas422—"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 requeridas

Hasta 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:

  1. Va a /forgot-password, escribe su correo → POST /api/v1/auth/forgot-password.
  2. Rate limit: 5 por minuto.
  3. El backend genera un token y envía correo con URL /reset-password?token=...&email=....
  4. El candidato entra al link, escribe nueva contraseña → POST /api/v1/auth/reset-password.
  5. El backend revoca todos los tokens Sanctum activos del usuario (seguridad) y actualiza el hash.
  6. Confirmación por email + redirección a /login.

Cierre de sesión ​

  • POST /api/v1/auth/logout revoca el token Sanctum actual.
  • El frontend llama setAuthToken(null) y limpia Zustand.
  • Redirige a /login.

Notificaciones relacionadas ​

EventoCanalPlantilla
Registro exitosoEmailVerifyEmail.php
Verificación de correoEmailWelcomeNotification.php
Contraseña reseteadaEmailResetPasswordNotification.php
Nuevo login desde IP desconocidaEmail (opcional)Fase 2

Errores comunes ​

ErrorCausaSolución
"Este correo ya está registrado"Ya existe un User con ese emailUsar 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 minReenviar correo
"Demasiados intentos"Hit rate limitEsperar 60 segundos

Siguiente ​

Ya verificado y logueado, el candidato debe contratar su membresía para ser visible en el directorio. Membresía y pago →

Manual de usuario HUMAE · Uso interno