184 lines
6.0 KiB
Markdown
184 lines
6.0 KiB
Markdown
# Auth Hook Setup Guide
|
|
|
|
## Overzicht
|
|
|
|
Deze hook detecteert duplicate emails VOOR een user wordt aangemaakt,
|
|
waardoor gebruikers direct feedback krijgen als hun email al geregistreerd is.
|
|
|
|
**Voordelen:**
|
|
- ✅ Server-side validatie (kan niet omzeild worden)
|
|
- ✅ Duidelijke foutmeldingen voor gebruikers
|
|
- ✅ Betrouwbaar (werkt ongeacht password)
|
|
- ✅ Case-insensitive email matching
|
|
- ✅ Email normalisatie (lowercase + trim)
|
|
|
|
## Setup (Eerste Keer)
|
|
|
|
### Stap 1: Deploy Migration
|
|
|
|
**Optie A: Via Supabase Dashboard (Aanbevolen)**
|
|
|
|
1. Ga naar: [Supabase Dashboard → SQL Editor](https://supabase.com/dashboard/project/dqugbrpwtisgyxscpefg/sql)
|
|
2. Open het migration bestand: `supabase/migrations/20251119094908_auth_hook_duplicate_email.sql`
|
|
3. Kopieer de volledige inhoud
|
|
4. Plak in de SQL Editor
|
|
5. Klik "RUN" om de functie aan te maken
|
|
|
|
**Optie B: Via Supabase CLI (Als geconfigureerd)**
|
|
|
|
```bash
|
|
npx supabase db push
|
|
```
|
|
|
|
### Stap 2: Verificatie & Instructies
|
|
|
|
Run het setup script om te verifiëren dat de functie bestaat:
|
|
|
|
```bash
|
|
pnpm run setup:auth-hook
|
|
```
|
|
|
|
Dit script:
|
|
- ✅ Checkt of de functie bestaat
|
|
- 📋 Geeft instructies voor Dashboard configuratie
|
|
- 🔗 Biedt directe links naar relevante Dashboard pagina's
|
|
|
|
### Stap 3: Configureer Hook Link
|
|
|
|
**⚠️ Deze stap moet handmatig via Dashboard** (Supabase ondersteunt dit nog niet via API):
|
|
|
|
1. Ga naar: [Supabase Dashboard → Auth → Hooks](https://supabase.com/dashboard/project/dqugbrpwtisgyxscpefg/auth/hooks)
|
|
2. Klik **"Add a new hook"** of **"Enable Hooks"**
|
|
3. Vul in:
|
|
- **Hook Type:** "Send a hook on before a user is created" (`before-user-created`)
|
|
- **Select hook:** "Postgres Function"
|
|
- **Schema:** `public`
|
|
- **Function Name:** `hook_check_duplicate_email`
|
|
4. Klik **"Create hook"** of **"Save"**
|
|
|
|
### Stap 4: Test
|
|
|
|
Test de hook door:
|
|
|
|
1. Ga naar je signup pagina: `http://localhost:3000/login`
|
|
2. Probeer te registreren met een **bestaand** emailadres (bijv. `demo@mini-ecd.demo`)
|
|
3. Je zou een error moeten zien: _"Dit emailadres is al geregistreerd. Probeer in te loggen of gebruik 'Wachtwoord vergeten?'."_
|
|
4. Probeer te registreren met een **nieuw** emailadres
|
|
5. Dit zou normaal moeten werken (verificatie email verzonden)
|
|
|
|
## Test Cases
|
|
|
|
| Test Case | Scenario | Expected Result |
|
|
|-----------|----------|-----------------|
|
|
| TC1 | Signup met nieuw email | ✅ Account aangemaakt, email verzonden |
|
|
| TC2 | Signup met bestaand email | ❌ Error: "Dit emailadres is al geregistreerd..." |
|
|
| TC3 | Signup met bestaand email (case variant: `Email@Example.com`) | ❌ Error (case-insensitive match) |
|
|
| TC4 | Signup met lege/NULL email | ❌ Error: "Email adres is verplicht." |
|
|
| TC5 | Hook disabled → signup met bestaand email | ⚠️ Oude gedrag (geen error, maar ook geen email) |
|
|
|
|
## Herhaalbaarheid
|
|
|
|
- ✅ **Functie code** staat in migrations (version controlled)
|
|
- ⚠️ **Hook link** moet per omgeving handmatig worden geconfigureerd
|
|
- ✅ **Documentatie** staat in Git
|
|
- ✅ **Setup script** voor validatie en instructies
|
|
|
|
## Technische Details
|
|
|
|
### Wat Doet de Hook?
|
|
|
|
De `hook_check_duplicate_email` functie:
|
|
|
|
1. Ontvangt signup event van Supabase Auth
|
|
2. Haalt email adres uit event payload
|
|
3. Valideert email (niet NULL/empty)
|
|
4. Normaliseert email (lowercase + trim)
|
|
5. Checkt of email al bestaat in `auth.users` table (case-insensitive)
|
|
6. Als email bestaat → return error object
|
|
7. Als email nieuw is → return empty object (allow signup)
|
|
|
|
### Security
|
|
|
|
- **Security Definer:** Functie draait met elevated permissions
|
|
- **Search Path:** Expliciet ingesteld op `public, auth` voor veilige schema access
|
|
- **Permissions:** Alleen `supabase_auth_admin` kan de functie uitvoeren
|
|
- **Email Enumeration Protection:** Werkt samen met bestaande email confirmation
|
|
|
|
### Performance
|
|
|
|
- ⚡ Direct database check (geen extra HTTP calls)
|
|
- ⚡ Indexed lookup op `auth.users.email`
|
|
- ⚡ Minimale overhead (< 10ms typisch)
|
|
|
|
## Toekomstige Verbeteringen
|
|
|
|
Zodra Supabase Management API Auth Hooks ondersteunt, kunnen we:
|
|
|
|
- [ ] Hook link volledig automatiseren
|
|
- [ ] Setup script uitbreiden met API calls
|
|
- [ ] CI/CD pipeline voor hook configuratie
|
|
- [ ] Automated tests voor hook functionaliteit
|
|
|
|
## Flexibiliteit
|
|
|
|
De functie is geschreven in standaard PostgreSQL, waardoor:
|
|
|
|
- ✅ Werkt met elke auth provider die Postgres functies ondersteunt
|
|
- ✅ Makkelijk te migreren naar andere auth systemen
|
|
- ✅ Geen vendor lock-in voor de logica zelf
|
|
|
|
## Troubleshooting
|
|
|
|
### "Function does not exist" error
|
|
|
|
**Probleem:** De hook functie is niet aangemaakt in de database.
|
|
|
|
**Oplossing:**
|
|
1. Controleer of migration is uitgevoerd via Dashboard of CLI
|
|
2. Run `pnpm run setup:auth-hook` voor verificatie
|
|
3. Check Supabase logs voor SQL errors
|
|
|
|
### Hook lijkt niet te werken
|
|
|
|
**Probleem:** Signup met bestaand email geeft geen error.
|
|
|
|
**Mogelijke oorzaken:**
|
|
1. Hook link niet geconfigureerd in Dashboard → Ga naar Auth → Hooks
|
|
2. Hook is disabled → Check hook status in Dashboard
|
|
3. Email confirmation staat uit → Check Auth → Email Templates
|
|
|
|
**Verificatie:**
|
|
```sql
|
|
-- Check of functie bestaat
|
|
SELECT routine_name
|
|
FROM information_schema.routines
|
|
WHERE routine_schema = 'public'
|
|
AND routine_name = 'hook_check_duplicate_email';
|
|
|
|
-- Test functie handmatig
|
|
SELECT hook_check_duplicate_email('{"user": {"email": "demo@mini-ecd.demo"}}'::jsonb);
|
|
```
|
|
|
|
### Wrong error message
|
|
|
|
**Probleem:** Error message klopt niet of is in het Engels.
|
|
|
|
**Oplossing:**
|
|
1. Check of je de laatste versie van de migration hebt gebruikt
|
|
2. Update functie via SQL Editor met correcte error messages
|
|
3. Rebuild client error handling (`app/login/page.tsx`)
|
|
|
|
## Related Documentation
|
|
|
|
- [Supabase Auth Hooks Documentation](https://supabase.com/docs/guides/auth/auth-hooks)
|
|
- [Bouwplan: Auth Hook Implementation](./bouwplan-auth-hook-duplicate-email-v1.0.md)
|
|
- [Main README](../README.md)
|
|
|
|
## Support
|
|
|
|
Voor vragen of problemen:
|
|
1. Check deze documentatie
|
|
2. Check Supabase logs in Dashboard
|
|
3. Run `pnpm run setup:auth-hook` voor diagnostics
|
|
4. Review `supabase/migrations/20251119094908_auth_hook_duplicate_email.sql`
|