# Auth — Passwordless-First

## Flow de connexion (priorite)

1. **Passkey** (WebAuthn) — methode principale, un clic
2. **Google / GitHub** — OAuth social, zero friction
3. **Magic Link** (Resend) — fallback email, lien valide 5 min

> Pas de mot de passe. `emailAndPassword: { enabled: false }`.

## Anti-abus (free trial)

### Normalisation email (`lib/email-utils.ts`)
- Gmail : suppression des dots et +aliases (`j.o.h.n+test@gmail.com` → `john@gmail.com`)
- Autres : suppression des +aliases uniquement
- `googlemail.com` → `gmail.com`

### Domaines bloques
- 40+ domaines jetables (tempmail, guerrillamail, yopmail, etc.)
- `privaterelay.appleid.com` (iCloud Private Relay)

### Hook BetterAuth
```typescript
databaseHooks.user.create.before → normalizeEmail() + isBlockedDomain()
```

## Session enrichie (`customSession`)

La session est enrichie avec des donnees custom (cachee 5 min via `cookieCache`) :

| Champ | Type | Description |
|-------|------|-------------|
| `user.plan` | `"free" \| "solo" \| "pro"` | Plan actif |
| `user.limits` | `PlanLimits` | Limites du plan |
| `user.todayUsage` | `number` | Total requetes du jour |
| `user.orgRole` | `string \| null` | Role dans l'org active (owner/admin/member) |

## 2FA

TOTP uniquement (pas de SMS). Active/desactive sans mot de passe (passwordless-adapted).
