Desde el reciente cambio en la PR #43042, /u/check_username.json está limitado a 10 solicitudes por minuto por IP.
Esto parece causar una regresión en el flujo de registro normal.
Al crear una nueva cuenta, Discourse verifica automáticamente la disponibilidad del nombre de usuario. Un usuario no necesita enviar el formulario repetidamente para alcanzar este límite. Simplemente ingresar una dirección de correo electrónico y un nombre de usuario, hacer una pausa mientras se escribe, cambiar el nombre de usuario o corregirlo puede resultar en múltiples solicitudes a /u/check_username.json.
Una vez que se alcanza el límite, el formulario de registro muestra:
Has realizado esta acción demasiadas veces, por favor intenta de nuevo más tarde.
El error se muestra directamente debajo del campo de nombre de usuario y efectivamente impide que el usuario continúe hasta que expire el limitador de tasa.
No hay ninguna indicación de cuánto tiempo debe esperar el usuario, y desde la perspectiva del usuario parece que el nombre de usuario elegido o el formulario de registro están rotos.
Pasos para reproducir
- Abre el formulario de registro como usuario anónimo.
- Ingresa una dirección de correo electrónico válida.
- Ingresa y modifica el nombre de usuario varias veces, permitiendo que se ejecute la verificación de disponibilidad entre los cambios.
- Continúa hasta que
/u/check_username.jsonse haya llamado más de 10 veces en un minuto. - El campo de nombre de usuario comienza a mostrar el error del limitador de tasa:
Has realizado esta acción demasiadas veces, por favor intenta de nuevo más tarde.
Comportamiento esperado
Un usuario normal que complete o corrija el formulario de registro no debería ser bloqueado por un límite de tasa interno activado por las verificaciones automáticas de disponibilidad del nombre de usuario.
Si se requiere la limitación de tasa para prevenir el abuso, la experiencia de usuario normal del registro debería degradarse de manera elegante en lugar de exponer un error de límite de tasa e impedir la creación de la cuenta.
Comportamiento actual
El usuario recibe un error de validación en línea en el campo de nombre de usuario y no puede continuar normalmente hasta que expire el límite de tasa.
Cambio relevante
Parece que esto se introdujo por:
PR #43042 – DEV: Limitar las solicitudes de check_username por IP
La implementación actual utiliza:
RateLimiter.new(
current_user,
"check-username-#{request.remote_ip}",
10,
1.minute
).performed!
La interfaz de usuario de registro en sí puede generar múltiples verificaciones de nombre de usuario, por lo que un límite de 10 solicitudes por minuto puede alcanzarse durante una interacción legítima.
Esto también puede ser aún más problemático para los usuarios detrás de direcciones IP públicas/NAT compartidas, ya que el limitador es por IP y no por sesión.
Observación adicional
check_email también tiene un limitador de 10 solicitudes/minuto/IP, pero cuando se excede ese límite, devuelve una respuesta exitosa en lugar de mostrar el error de límite de tasa al usuario.
Por lo tanto, podría tener sentido que check_username se comporte de manera similar, o alternativamente:
-
aumentar el límite;
-
hacerlo configurable;
-
evitar contar las solicitudes de sugerencia de nombre de usuario/validación automática en el mismo grupo;
-
o manejar la limitación de tasa en el lado del cliente sin bloquear el flujo de registro.
Puedo reproducir esto en una instalación actual de Discourse, incluido https://try.discourse.org/ después del cambio de la PR #43042.
