@eqs/auth : derrière un reverse-proxy, tout le monde partage le même seau de limitation de débit #137

Closed
opened 2026-10-12 09:28:47 +00:00 by nicolas-fryder · 0 comments

Commande

Deux POST /api/auth/sign-in/email vers un satellite derrière Traefik (Coolify), l'un avec X-Forwarded-For: 1.1.1.1, 10.0.0.1, l'autre avec X-Forwarded-For: 2.2.2.2, 10.0.0.1.

Attendu

Deux seaux distincts : l'adresse réelle est l'avant-dernière entrée, la dernière étant celle du proxy.

Observé

Un seul seau. better-auth ne fait confiance qu'à un en-tête à valeur unique ; avec une chaîne, il retombe sur une clé commune. Toute l'agence partage alors le plafond de connexion, et un attaquant bloque tout le monde. creerAuth n'expose ni trustedProxies ni advanced.ipAddress.

Versions

@eqs/auth 0.19.0 / 0.20.0, better-auth 1.7.7.

Contournement

ATLAS réécrit l'en-tête dans /api/auth/[...all] avec son clientIp() (la FIN de la chaîne, au nombre de sauts TRUSTED_PROXY_HOPS) avant de passer la requête à better-auth.

Proposition

Une option sautsDeProxy (ou TRUSTED_PROXY_HOPS dans baseSchema) que creerAuth traduit en advanced.ipAddress, avec un contrôle de conformité « deux adresses → deux seaux ». Topologie pose ipAddressHeaders: ['x-forwarded-for'] à la main pour la même raison.

Ouvert depuis le rejeu du rétrofit d'ATLAS (étape 5a).

## Commande Deux `POST /api/auth/sign-in/email` vers un satellite derrière Traefik (Coolify), l'un avec `X-Forwarded-For: 1.1.1.1, 10.0.0.1`, l'autre avec `X-Forwarded-For: 2.2.2.2, 10.0.0.1`. ## Attendu Deux seaux distincts : l'adresse réelle est l'avant-dernière entrée, la dernière étant celle du proxy. ## Observé Un seul seau. better-auth ne fait confiance qu'à un en-tête à valeur unique ; avec une chaîne, il retombe sur une clé commune. Toute l'agence partage alors le plafond de connexion, et un attaquant bloque tout le monde. `creerAuth` n'expose ni `trustedProxies` ni `advanced.ipAddress`. ## Versions @eqs/auth 0.19.0 / 0.20.0, better-auth 1.7.7. ## Contournement ATLAS réécrit l'en-tête dans `/api/auth/[...all]` avec son `clientIp()` (la FIN de la chaîne, au nombre de sauts `TRUSTED_PROXY_HOPS`) avant de passer la requête à better-auth. ## Proposition Une option `sautsDeProxy` (ou `TRUSTED_PROXY_HOPS` dans `baseSchema`) que `creerAuth` traduit en `advanced.ipAddress`, avec un contrôle de conformité « deux adresses → deux seaux ». Topologie pose `ipAddressHeaders: ['x-forwarded-for']` à la main pour la même raison. *Ouvert depuis le rejeu du rétrofit d'ATLAS (étape 5a).*
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Infrastructure/eqs-platform#137
No description provided.