
🔐 Lerne Authentifizierung, indem du es richtig machst. Eine erweiterbare, standardkonforme Referenzimplementierung für Cloudflare Workers mit Hono, Turso, PBKDF2 und JWT-Dual-Token-Sessions.
Lerne Authentifizierung, indem du sie richtig implementierst.
Live Demo · Threat Model · Auth Flows · ADRs
Demo-Hinweis: Der Login-Endpunkt ist durch adaptive PoW-Herausforderungen geschützt – wiederholte Fehlversuche erhöhen den Proof-of-Work-Schwierigkeitsgrad. Cache-gestütztes Rate-Limiting ist implementiert und getestet, aber aktuell in der Live-Demo nicht aktiviert; setze
createCacheClientinapp.tsum es zu aktivieren.
Eine von Grund auf entwickelte Authentifizierungs-Referenzimplementierung für Cloudflare Workers – PBKDF2-Passwort-Hashing, JWT-Dual-Token-Sessions, Konstantzeit-Vergleich, gleitendes Ablaufdatum und ein entfernbarer Observability-Plugin – alles zusammengeschaltet mit Hono, Turso (optional mit Valkey/Redis-Caching) und striktem TypeScript.
Jede Designentscheidung geht auf einen Standard zurück: NIST SP 800-63B für Anmeldedaten, NIST SP 800-132 für Schlüsselableitung, OWASP ASVS für Verifikation und RFC 8725 für JWT-Best Practices.
Du entwickelst ein Produkt? Verwende stattdessen Better Auth – es deckt OAuth, Passkeys, MFA, Rate-Limiting und mehr direkt aus der Box ab, mit einem aktiven Plugin-Ökosystem. Dieses Repository dient dazu, dir zu zeigen, wie Authentifizierung funktioniert, und nicht als Ersatz für eine Produktionsbibliothek.
Dieses Projekt lässt bewusst Funktionen weg, die außerhalb seines pädagogischen Rahmens liegen. Wenn du diesen Code in Richtung Produktion erweiterst (oder bewertest, was ein Produktions-Auth-System benötigt), ordnen die folgenden Tabellen die Lücken nach Prioritätsstufen.
Für die meisten realen Projekte verwende stattdessen Better Auth, anstatt diese selbst zu bauen.
| Funktion | Warum sie wichtig ist | Standard / Referenz |
|---|---|---|
| Prüfung auf kompromittierte Passwörter | Verhindert die Verwendung von Passwörtern, die bekanntermaßen in öffentlichen Passwort-Dumps vorkommen | NIST SP 800-63B §5.1.1.2, HIBP API |
All dies sind hervorragende Gründe, zu Better Auth zu greifen.
.
├── apps/
│ └── cloudflare-workers/ # Beispiel-Worker + Hono-Routen
├── packages/
│ ├── core/ # Auth-Dienste, Middleware, Crypto-Utilities
│ ├── infrastructure/ # DB-Client + Utilities
│ ├── observability/ # Ereignisausgabe, adaptive Challenges, Ops-API (entfernbarer Plugin)
│ ├── schemas/ # Zod-Schemas
│ └── types/ # Gemeinsame TypeScript-Typen
├── tools/
│ └── cli/ # plctl — Go TUI für die /ops-Oberfläche
└── docs/
├── adr/ # Architecture Decision Records
└── audits/ # Sicherheitsaudits
git clone https://github.com/vhscom/private-landing.git
cd private-landing
bun install
bun run dev
Das war's – keine Konten, keine API-Schlüssel, keine .env-Dateien. Der Dev-Server startet mit einer lokalen SQLite-Datenbank und generierten Geheimnissen. Öffne http://localhost:8788, um ein Konto zu registrieren und die Auth-Abläufe zu erkunden.
Hast du ein Turso-Konto? Lege eine
.dev.vars-Datei inapps/cloudflare-workers/an (siehe.dev.vars.example) undbun run devverwendet automatisch wrangler mit deiner entfernten Datenbank. Verwendebun run dev:local, um unabhängig davon den lokalen Server zu erzwingen.
Siehe CONTRIBUTING.md für Test- und Bereitstellungsanweisungen.
Dieses Repository enthält eine CLAUDE.md-Datei, die Kontext für KI-Assistenten bereitstellt. Bei Verwendung von Claude Code, Cursor oder ähnlichen KI-gestützten Entwicklungstools:
CLAUDE.md für Projektkontextdocs/adr/ erklären Designentscheidungendocs/audits/ dokumentieren die SicherheitslageDie Codebasis ist für KI-Lesbarkeit mit klaren Modulgrenzen, umfassenden Typen und beschreibenden Namen ausgelegt.
| Ebene | Was sie tut |
|---|
| Passwortspeicher | PBKDF2-SHA384 mit 128-Bit-Salts, Integritäts-Digest, Versionsverfolgung (password-service.ts) |
| Sitzungsverwaltung | Serverseitige Sitzungen mit Gerätetracking, gleitendem Ablauf, maximal 3 pro Benutzer; optionale cache-gestützte Sitzungen via Valkey/Redis (session-service.ts, cached-session-service.ts) |
| Passwortänderung | Aktuelles-Passwort-Neuverifikation, vollständiger PBKDF2-Neu-Hash, atomare Sperrung aller Sitzungen (account-service.ts, ADR-004) |
| JWT-Dual-Token-Ansatz | 15-Minuten-Access + 7-Tage-Refresh-Tokens, sitzungsgebunden für Sperrung (token-service.ts) |
| Auth-Middleware | Automatischer Refresh-Ablauf, explizites HS256-Pinning, typ-Anspruchsvalidierung (require-auth.ts) |
| Sichere Cookies | HttpOnly, Secure, SameSite=Strict, Path=/ (cookie.ts) |
| Sicherheitsheader | HSTS, CSP, CORP/COEP/COOP, Permissions-Policy, Fingerabdruck-Entfernung (security.ts) |
| Eingabevalidierung | Zod-Schemas mit NIST-konformer Passwortrichtlinie (nur Länge, keine Komplexitätsregeln) |
| Rate-Limiting | Fixed-Window-Drosselung gegen Brute-Force- und Credential-Stuffing-Angriffe: IP-basiert auf öffentlichen Auth-Routen (z. B. Login), benutzerbasiert auf geschützten Aktionen; keine harten Sperren (NIST-konform) (ADR-006) |
| Observability-Plugin | Strukturierte Sicherheitsereignisse, adaptive PoW-Herausforderungen, agentenauthentifizierte /ops-API – wird per Middleware eingesteckt, entfernt durch Löschen eines Pakets (ADR-008) |
| CLI-Tools | Go TUI (plctl) zum Abfragen von Ereignissen, Verwalten von Sitzungen und Bereitstellen von Agent-Anmeldedaten über die /ops-Oberfläche (tools/cli/) |
| Angriffsvektor-Tests | JWT-Manipulation, Algorithmus-Verwirrung, Typenverwirrung, Unicode-Randfälle, Informationsoffenlegungs-Checks |
| Funktion | Warum sie wichtig ist | Standard / Referenz |
|---|
| CSRF-Schutz (falls SameSite gelockert) | SameSite=Strict verhindert derzeit CSRF; falls aus UX-Gründen auf Lax geändert, wird ein explizites Token benötigt | OWASP CSRF Cheat Sheet |
| Refresh-Token-Rotation | Erkennt Token-Diebstahl – wenn ein rotiertes Refresh-Token erneut eingespielt wird, sperre die gesamte Sitzungsfamilie | RFC 6819 §5.2.2.3 |
aud-Anspruch in JWTs | Verhindert, dass ein Token von einem Dienst von einem anderen mit demselben Geheimnis akzeptiert wird | RFC 7519 §4.1.3, RFC 8725 §3.9 |
| CSP-Nonces für Inline-Skripte | Derzeitige CSP verwendet 'unsafe-inline'; Nonces eliminieren Inline-Script-XSS-Vektoren | MDN CSP script-src |
| Funktion | Warum sie wichtig ist | Standard / Referenz |
|---|
| TOTP-Multi-Faktor-Authentifizierung | Fügt einen zweiten Faktor für hochwertige Konten hinzu | RFC 6238, NIST SP 800-63B §5.1.4 |
| WebAuthn / Passkeys | Phishing-resistente Authentifizierung mit Plattform-Authentifikatoren | WebAuthn Level 2 |
| OAuth / Social Login | Reduziert Hürden, vermeidet Passwortmüdigkeit | RFC 6749 |
| Magic Links / OTP | Passwortlose Option für risikoarme Abläufe | NIST SP 800-63B §5.1.3 |
| Sitzungsanalytik | Gerätetracking, Sichtbarkeit gleichzeitiger Sitzungen, Anomalieerkennung | OWASP Session Management Cheat Sheet |
| Signierschlüssel-Rotation | Ermöglicht regelmäßige Geheimnisrotation ohne Sperrung aller Sitzungen | RFC 7517 (JWK) |
| Funktion | Warum sie wichtig ist | Standard / Referenz |
|---|
| DPoP / Token-Binding | Bindet Token an die TLS-Verbindung des Clients und verhindert Exfiltrations-Wiederholung | RFC 9449 (DPoP) |
| Multi-Tenancy | Trennt Benutzerpools, Geheimnisse und Richtlinien pro Mandant | Anwendungsspezifisch |
| Geofencing / IP-Reputation | Blockiert Logins aus unerwarteten Regionen oder bekannten schlechten IPs | OWASP ASVS v5.0 §6.3.5 |
| Adaptive Authentifizierung | Erhöht Authentifizierungsanforderungen basierend auf Risikosignalen (Gerät, Standort, Verhalten) | NIST SP 800-63B §6 |
| PBKDF2-Iterations-Upgrade oder Argon2id | OWASP empfiehlt 210.000 PBKDF2-SHA512-Iterationen (Cloudflare begrenzt auf 100k); Argon2id ist speicherhart | OWASP Password Storage Cheat Sheet |