Skip to content

Fix faux « Code invalide » OTP - #8

Merged
PiLep merged 1 commit into
mainfrom
cursor/fix-otp-invalid-code-c90b
Jul 27, 2026
Merged

PiLep merged 1 commit into
mainfrom
cursor/fix-otp-invalid-code-c90b

Conversation

@PiLep

@PiLep PiLep commented Jul 27, 2026

Copy link
Copy Markdown
Owner

Problème

Un code OTP correct pouvait être refusé avec « Code invalide », surtout après un premier essai qui semblait échouer.

Causes principales côté app :

  1. OTP consommé puis échec post-vérification — le hook session.create appelait ensurePersonalOrganization via une seconde connexion SQLite ; si le provisioning org plantait, la session n’était pas créée alors que le code était déjà brûlé → retry = Invalid OTP.
  2. Lignes verification en double — Better Auth email-otp ne déduplique que sur contrainte unique, absente du schéma stock (better-auth#10437) ; mauvais code + renvoi pouvait laisser une ligne périmée gagner.
  3. Saisie / autofill — espaces ou tirets (123 456) cassent la comparaison stricte.
  4. Renvoi — chaque « Recevoir un code » générait un nouveau OTP ; l’ancien mail restait affiché.

Correctifs

  • Une seule connexion SQLite partagée (getDb() → Better Auth)
  • Provisioning org best-effort : un échec n’empêche plus la connexion après un OTP valide (requireTenant retente ensuite)
  • Index unique partiel SQLite sur les identifiants OTP + nettoyage des doublons
  • resendStrategy: "reuse" tant que le code est encore valide
  • Normalisation des chiffres côté UI + messages d’erreur FR plus clairs

Tests

  • npm test (49 tests, dont normalise OTP + index singleton)
  • npx tsc --noEmit OK

Déploiement

Redémarrer l’app après déploiement pour appliquer l’index OTP. Si multi-tenant n’a jamais été migré : npm run auth:migrate reste nécessaire.

Open in Web Open in Cursor 

Share one SQLite connection for Better Auth and app helpers, keep a
singleton OTP verification row, reuse unexpired codes on resend, and
normalize pasted OTP input so a valid code is not rejected.

Co-authored-by: Pile <pierre@kanta.fr>
@PiLep
PiLep marked this pull request as ready for review July 27, 2026 19:48
@PiLep
PiLep merged commit 8e9a285 into main Jul 27, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants