Cambio de email con doble confirmación (completa el bloque de auth)

- lib/change-email.ts: requestEmailChange (valida pass/email/token, crea activación
  con old_email/old_email_hash, email al correo actual), confirmOldEmail (marca is_used,
  email al nuevo), confirmNewEmail (re-deriva verifier con el nuevo email + actualiza
  battlenet_accounts y account; borra la activación).
- components/ConfirmClient.tsx: cliente genérico que confirma un hash por POST al abrir.
- Routes /api/account/change-email, /confirm-old-email, /confirm-new-email.
- Páginas /change-email (protegida) y /confirm-old-email, /confirm-new-email (auto).
- Catálogos ChangeEmail, ConfirmOldEmail, ConfirmNewEmail.

Verificado: change-email protegida (401/redirect), confirmaciones con hash inválido
-> invalidLink sin crash. AUTH 100% reimplementado en Next.js.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-12 23:41:42 +00:00
parent 1da7349373
commit cceab26999
11 changed files with 390 additions and 0 deletions
+31
View File
@@ -206,5 +206,36 @@
"wrongCurrentPassword": "La contraseña actual es incorrecta.",
"accountNotFound": "No se ha encontrado la cuenta.",
"genericError": "Algo ha salido mal. Inténtalo más tarde."
},
"ChangeEmail": {
"title": "Cambiar correo",
"info": "El correo actual debe escribirse tal cual, respetando mayúsculas/minúsculas. El nuevo correo debe ser de Gmail. Necesitas un token de seguridad.",
"currentPassword": "Contraseña actual",
"currentEmail": "Correo actual",
"newEmail": "Nuevo correo",
"confEmail": "Confirmar nuevo correo",
"token": "Token de seguridad",
"submit": "Cambiar correo",
"sending": "Enviando…",
"success": "Se ha enviado un correo de confirmación a tu correo actual.",
"missingFields": "Por favor, complete todos los campos.",
"wrongCurrentEmail": "El correo actual no es correcto.",
"invalidEmail": "El nuevo correo no es válido.",
"invalidToken": "El token de seguridad es incorrecto.",
"wrongCurrentPassword": "La contraseña actual es incorrecta.",
"genericError": "Algo ha salido mal. Inténtalo más tarde."
},
"ConfirmOldEmail": {
"title": "Confirmar cambio de correo",
"activating": "Confirmando…",
"success": "Correo actual confirmado. Revisa tu NUEVO correo para completar el segundo paso.",
"error": "El enlace no es válido o ya se ha usado."
},
"ConfirmNewEmail": {
"title": "Confirmar nuevo correo",
"activating": "Aplicando el cambio…",
"success": "¡Correo cambiado con éxito! Ya puedes iniciar sesión con el nuevo correo.",
"error": "El enlace no es válido, ha caducado o no se ha encontrado la cuenta.",
"goLogin": "Ir a iniciar sesión"
}
}