A seguito della recente modifica nella PR #43042, /u/check_username.json è soggetto a un limite di frequenza di 10 richieste al minuto per IP.
Sembra che ciò stia causando un regressione nel flusso di registrazione normale.
Durante la creazione di un nuovo account, Discourse verifica automaticamente la disponibilità del nome utente. Non è necessario che un utente invii il modulo ripetutamente per raggiungere questo limite. Semplicemente inserendo un indirizzo e-mail e un nome utente, facendo una pausa durante la digitazione, modificando il nome utente o correggendolo, è possibile generare più richieste a /u/check_username.json.
Una volta raggiunto il limite, il modulo di registrazione visualizza:
Hai eseguito questa azione troppe volte, per favore riprova più tardi.
L’errore viene mostrato direttamente sotto il campo del nome utente e blocca efficacemente l’utente dal procedere fino a quando il limite di frequenza non scade.
Non c’è alcuna indicazione su quanto tempo l’utente debba attendere e, dal punto di vista dell’utente, sembra che il nome utente scelto o il modulo di registrazione siano difettosi.
Passaggi per riprodurre il problema
- Apri il modulo di registrazione come utente anonimo.
- Inserisci un indirizzo e-mail valido.
- Inserisci e modifica più volte il nome utente, consentendo alla verifica di disponibilità del nome utente di essere eseguita tra una modifica e l’altra.
- Continua fino a quando
/u/check_username.jsonnon viene chiamato più di 10 volte entro un minuto. - Il campo del nome utente inizia a mostrare l’errore del limite di frequenza:
Hai eseguito questa azione troppe volte, per favore riprova più tardi.
Comportamento atteso
Un utente normale che completa o corregge il modulo di registrazione non dovrebbe essere bloccato da un limite di frequenza interno attivato dalle verifiche automatiche di disponibilità del nome utente.
Se il limite di frequenza è necessario per prevenire abusi, l’esperienza utente normale di registrazione dovrebbe degradarsi in modo graduale anziché esporre un errore di limite di frequenza e impedire la creazione dell’account.
Comportamento attuale
L’utente riceve un errore di validazione inline nel campo del nome utente e non può procedere normalmente fino a quando il limite di frequenza non scade.
Modifica rilevante
Sembra che questo sia stato introdotto da:
PR #43042 – DEV: Rate limit check_username requests per IP
L’implementazione attuale utilizza:
RateLimiter.new(
current_user,
"check-username-#{request.remote_ip}",
10,
1.minute
).performed!
L’interfaccia utente di registrazione stessa può generare più verifiche del nome utente, quindi un limite di 10 richieste al minuto può essere raggiunto durante un’interazione legittima.
Questo potrebbe essere ancora più problematico per gli utenti dietro indirizzi IP pubblici/NAT condivisi, poiché il limitatore è per IP e non per sessione.
Osservazione aggiuntiva
check_email ha anche un limitatore di 10 richieste/minuto/IP, ma quando quel limite viene superato restituisce una risposta di successo anziché mostrare l’errore di limite di frequenza all’utente.
Potrebbe quindi avere senso che check_username si comporti in modo simile, oppure:
-
aumentare il limite;
-
renderlo configurabile;
-
evitare di contare le richieste di suggerimento del nome utente/validazione automatica nella stessa bucket;
-
o gestire il limite di frequenza lato client senza bloccare il flusso di registrazione.
Posso riprodurre questo su un’installazione Discourse attuale, incluso https://try.discourse.org/ dopo la modifica della PR #43042.
