El enlace de activación vuelve a ser alfanumérico; avisar a qué correo se envió

Dos cosas que el port de Django cambió sin querer:

- El hash de activación se generaba con `randomBytes(16).toString('hex')`: 32
  caracteres, sí, pero solo `0-9a-f`. El original era `get_random_string(32)`,
  alfanumérico con mayúsculas y minúsculas (`?act=P4JHQDJey2jJDnEBnqUePI5O2qEFB1`).
- El aviso de cuenta creada era un genérico «Revisa tu correo», mientras que el
  original decía qué cuenta se creó y a qué dirección fue el enlace. Se recupera
  el formato de dos líneas (con id `create-response`, como el original).

El muestreo por rechazo del token de seguridad se sube a `lib/random-token.ts` y
lo comparten los dos generadores, que solo se diferencian en el alfabeto: letras
para el token que se teclea a mano, alfanumérico para el hash de la URL.

Verificado con 100.000 hashes: todos casan /^[A-Za-z0-9]{32}$/, salen los 62
caracteres y la desviación por carácter se queda en 1,3% (ruido).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-15 17:34:53 +00:00
parent 6e4a123dde
commit 8c85cf2dbe
6 changed files with 58 additions and 30 deletions
+2 -1
View File
@@ -177,7 +177,8 @@
"recruiter": "Recruiter (optional)",
"submit": "Create account",
"creating": "Creating…",
"success": "The account has been created. Check your email to activate it.",
"success": "The account '{email}' has been created.",
"successActivation": "An activation link has been sent to {email}.",
"missingFields": "Please fill in all fields.",
"passwordMismatch": "Passwords do not match.",
"passwordTooLong": "The password must not exceed 16 characters.",
+2 -1
View File
@@ -177,7 +177,8 @@
"recruiter": "Reclutante (opcional)",
"submit": "Crear cuenta",
"creating": "Creando…",
"success": "La cuenta se ha creado. Revisa tu correo para activarla.",
"success": "La cuenta '{email}' ha sido creada.",
"successActivation": "Se ha enviado un enlace de activación al correo {email}.",
"missingFields": "Por favor, complete todos los campos.",
"passwordMismatch": "Las contraseñas no coinciden.",
"passwordTooLong": "La contraseña no debe exceder los 16 caracteres.",