# 🔐 Authentication Implementation Notes fĂŒr ulo.ad ## Übersicht Diese Dokumentation beschreibt wichtige Implementierungsdetails und Lösungen fĂŒr hĂ€ufige Probleme im Authentication-Flow von ulo.ad. --- ## ⚠ Wichtige SvelteKit + PocketBase Quirks ### 1. Login Redirect Problem **Problem:** Nach erfolgreichem Login wird fĂ€lschlicherweise "Invalid email or password" angezeigt, obwohl der Login funktioniert hat. **Ursache:** SvelteKit's `redirect()` Funktion wirft intern eine Exception. Wenn diese im try-catch-Block steht, wird sie als Login-Fehler interpretiert. **❌ Falsch:** ```typescript // src/routes/login/+page.server.ts try { await locals.pb.collection('users').authWithPassword(email, password); redirect(303, '/dashboard'); // ⚠ Wirft Exception! } catch (err) { return fail(400, { error: 'Invalid email or password' }); // FĂ€ngt redirect! } ``` **✅ Richtig:** ```typescript // src/routes/login/+page.server.ts try { await locals.pb.collection('users').authWithPassword(email, password); locals.user = locals.pb.authStore.model; } catch (err) { console.error('Login error:', err); return fail(400, { error: 'Invalid email or password' }); } // Redirect AUSSERHALB des try-catch! redirect(303, '/dashboard'); ``` --- ### 2. E-Mail Verifizierung Fehler **Problem:** PocketBase verifiziert den User erfolgreich, wirft aber trotzdem einen Fehler beim `confirmVerification()` Aufruf. **Lösung:** ```typescript // src/routes/verify-email/+page.server.ts try { await pb.collection('users').confirmVerification(token); redirect(303, '/login?verified=true'); } catch (error) { // PocketBase wirft IMMER einen Fehler, auch bei Erfolg! if (errorMessage.includes('expired')) { redirect(303, '/login?error=token-expired'); } else { // Behandle als Erfolg redirect(303, '/login?verified=true'); } } ``` --- ### 3. Registrierung mit E-Mail-Versand **Problem:** E-Mail-Verifizierung wird nicht gesendet, wenn nach der Registrierung Auth-Operationen durchgefĂŒhrt werden. **Reihenfolge ist kritisch:** ```typescript // src/routes/register/+page.server.ts // 1. User erstellen const newUser = await pb.collection('users').create({...}); // 2. ZUERST E-Mail senden (vor Auth-Operationen!) await pb.collection('users').requestVerification(email); // 3. DANN andere Operationen (z.B. Profil-Card erstellen) await pb.collection('users').authWithPassword(email, password); // ... weitere Operationen pb.authStore.clear(); // 4. Zur Login-Seite weiterleiten (KEIN Auto-Login!) redirect(303, '/login?registered=true'); ``` --- ## 📋 Best Practices ### Redirects in SvelteKit 1. **Immer außerhalb von try-catch**: Redirects gehören nicht in try-catch-Blöcke 2. **Return vs. Throw**: `redirect()` wirft eine Exception, `return fail()` gibt einen Wert zurĂŒck 3. **Error-First**: Erst alle Fehler behandeln, dann erfolgreiche Redirects ### PocketBase Authentication 1. **authStore.clear()**: Immer aufrufen wenn temporĂ€re Auth benötigt wurde 2. **locals.user**: Nach Login setzen fĂŒr sofortige VerfĂŒgbarkeit 3. **Verification**: Fehler als Erfolg behandeln (PocketBase Quirk) ### E-Mail-Versand 1. **Reihenfolge beachten**: E-Mails vor Auth-Operationen senden 2. **Template-KomplexitĂ€t**: Bei Problemen vereinfachte Templates ohne Unicode verwenden 3. **Error-Handling**: E-Mail-Fehler nicht den ganzen Flow blockieren lassen --- ## 🐛 Debugging-Tipps ### Login-Probleme ```bash # Console logs prĂŒfen console.error('Login error:', err); # PocketBase Admin prĂŒfen http://localhost:8090/_/ # → Logs → Auth Logs ``` ### E-Mail-Probleme ```bash # SMTP Logs in PocketBase http://localhost:8090/_/ # → Logs → Mails # Template testen mit einfacher Version docs/mail/email-templates-simplified.md ``` ### Session-Probleme ```javascript // Session-Status prĂŒfen console.log('Auth store valid:', locals.pb.authStore.isValid); console.log('Current user:', locals.pb.authStore.model); ``` --- ## 📁 Relevante Dateien ``` /src/routes/ ├── login/ │ ├── +page.server.ts # Login-Action mit korrektem Redirect │ └── +page.svelte # Status-Messages fĂŒr Verifizierung ├── register/ │ └── +page.server.ts # Registrierung mit E-Mail-Versand ├── verify-email/ │ └── +page.server.ts # Verifizierung mit Fehler-als-Erfolg └── (app)/ └── +layout.server.ts # User in locals setzen /src/hooks.server.ts # PocketBase Client initialisieren ``` --- ## ✅ Checkliste fĂŒr neue Auth-Features - [ ] Redirects außerhalb von try-catch - [ ] E-Mail-Versand vor Auth-Operationen - [ ] PocketBase Fehler als mögliche Erfolge behandeln - [ ] authStore.clear() nach temporĂ€ren Auth-Operationen - [ ] Proper error logging fĂŒr Debugging - [ ] User-freundliche Fehlermeldungen (bilingual) --- _Erstellt: 15. Januar 2025_ _Version: 1.0_ _FĂŒr: ulo.ad Authentication System_