fix(auth): dédupliquer les sousmissions de connexion/inscription concurrentes (PG::UniqueViolation, #769) - #274
Merged
Merged
Conversation
…urrentes Deux appels /oauth/token concurrents (double-clic sur Sign up, double callback OAuth, double déclenchement de l'initializer SSO, ...) portent le même (application_id, uid) pour un même compte. Le backend exécute alors User.get_user (*find_or_create_by* non atomique) deux fois, et l'une des requêtes échoue sur la contrainte index_users_on_uid_and_application_id (PG::UniqueViolation -> HTTP 500, #769). fetchToken n'avait aucune garde anti-déclenchement, contrairement à refreshToken qui patiente déjà via refreshInFlight. On applique la même garde in-flight à fetchToken : pendant qu'un /oauth/token est en vol, les nouveaux appels renvoient la même requête, un seul POST part pour le serveur. Co-authored-by: openhands <openhands@all-hands.dev>
- Suppression du commentaire introduit dans authTokenHandler.js. - Suppression des commentaires ajoutés dans les tests de fetchToken. - Ajout d'un AGENTS.md de base mentionnant qu'aucun commentaire ne doit être ajouté. Co-authored-by: openhands <openhands@all-hands.dev>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problème
Des
PG::UniqueViolationsurindex_users_on_uid_and_application_id(HTTP 500) surviennent à la création/connexion d'utilisateurs (ticket #769). La cause est côté interface : lePOST /oauth/tokenqui échange les identifiants et crée l'utilisateur côté serveur n'a aucune garde anti-renvoi simultané.Toutes les sources de doublon (double-clic sur Sign up, double
onCodeOAuth viareact-oauth-popup, double exécution de l'initializer SSO au montage + sur l'écouteurlogora:authentication:refresh, réémission du formulaire) convergent versuseAuthActions.loginUser → authTokenHandler.fetchToken, qui poste plusieurs requêtes concurrentes avec le même(application_id, uid)pour un même compte (uid stable du provider pour OAuth/social ;crypto.randomUUID()par soumission pour le formulaire e-mail).Côté backend,
User.get_userutilisefind_or_create_by(non atomique) : deux insertions concurrentes échouent sur la contrainte unique → HTTP 500.Correctif
refreshTokenpossède déjà une garde in-flight (refreshInFlight) et un test de déduplication ;fetchTokenn'en avait aucune. On applique la même garde in-flight àfetchTokendanssrc/components/auth/use_auth/authTokenHandler.js:/auth/tokenest en vol, les appels concurrents renvoient la même promise → un seul POST part du navigateur ;.finally()→ un retry manuel après erreur fonctionne toujours.Tests
Tests ajoutés dans
authTokenHandler.test.jsx:98 tests auth passent (
npx vitest run src/components/auth/).Note
Le correctif front supprime les doublons issus d'un double-clic / double callback. Pour rendre la création totalement idempotente en cas de course résiduelle (deux onglets, retry réseau), on peut ensuite rendre
User.get_userrace-safe côté LogoraAPI (retry surRecordNotUniqueou insert-on-conflict SQL) — correctif complémentaire proposé.Cette PR a été créée par un agent IA (OpenHands) pour le compte de @hboisgibault.