Zum Inhalt springen

Authentifizierung

  1. User gibt E-Mail + Passwort ein
  2. Backend sucht Account ueber email_relation (type: account_primary) → emailaccount
  3. Passwort-Pruefung per bcrypt
  4. Rate-Limiting: Max 5 fehlgeschlagene Versuche pro 15 Minuten (getrackt in login_attempt)
  5. Bei bekanntem Geraet (Device-Cookie vorhanden + in known_device Tabelle): Session wird direkt erstellt
  6. Bei unbekanntem Geraet: 2FA-Code per E-Mail, attempt_id zurueck an Frontend
  • Typ: E-Mail-basiert (6-stelliger kryptographisch zufaelliger Code)
  • Gueltigkeit: 30 Minuten
  • Ausloeser: Login von unbekanntem Geraet ODER twofactor_email Flag am Account
  • Nach erfolgreicher Verifikation: Session + Device-Token erstellt
  • known_device Tabelle speichert bekannte Geraete pro Account
  • Device-Cookie: 30 Tage, HttpOnly, Secure, SameSite=Lax
  • Bei bekanntem Device: 2FA wird uebersprungen
  • Remote-Logout-Mechanismus: Device aus DB loeschen → naechster Request schlaegt fehl
  • Dauer: 30 Tage (Cookie + DB-Eintrag)
  • Cookie: HttpOnly, Secure, SameSite=Lax
  • Terminierung: terminated_at Timestamp in DB
  • Session-Check: GET /api/public/auth/session validiert Cookie gegen DB
  • Logout: POST /api/protected/auth/logout setzt terminated_at
MethodePfadAuthBeschreibung
POST/api/public/auth/loginLogin (→ session_id oder attempt_id)
POST/api/public/auth/verify-2fa2FA-Code pruefen (→ session_id + device_token)
GET/api/public/auth/sessionSession validieren
POST/api/protected/auth/logoutSessionSession terminieren
internal/feature/auth/
├── usecase.go # Login, Verify2FA, SessionCheck, Logout, KnownDeviceExists
├── request.go # Request/Response Structs
├── repository.go # Interfaces (Account, Session, LoginAttempt, KnownDevice)
├── jet_repository.go # Jet-Implementierungen
├── password.go # bcrypt Helpers
└── errors.go # ErrInvalidCredentials, ErrAccountInactive, ErrTooManyAttempts, etc.