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