V 2.2.1 Anmeldung per Passkey (WebAuthn)
Passkey-Login analog zu werte-next: auf der Login-Seite "Mit Passkey anmelden", Verwaltung der eigenen Passkeys im neuen Tab Einstellungen. Das Passwort bleibt als Alternative bestehen. - lib/webauthn.ts, lib/passkeys.ts sowie API-Routen unter /api/passkey - proxy.ts: /api/passkey/authenticate ohne Session erreichbar - TabLayout: dritter Tab Einstellungen (Index-Tabs statt Route wie werte) - RP-Konfiguration ueber AUSGABEN_RP_*, da sich die .env auf dem Server mit anderen Apps teilt, die RP_ID/RP_ORIGIN bereits belegen - Eigene Tabelle ausgaben_passkeys aus demselben Grund: werte-next nutzt in der gemeinsamen Datenbank RXF bereits die Tabelle passkeys - eslint.config.mjs auf die Flat-Config von eslint-config-next umgestellt Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+31
-2
@@ -8,11 +8,19 @@ Diese Authentifizierungslösung kann einfach in andere Next.js Projekte übernom
|
||||
- `/lib/auth.ts` - Authentifizierungslogik (Benutzerverwaltung über .env)
|
||||
- `/lib/session.ts` - JWT-basiertes Session-Management
|
||||
- `/middleware.ts` - Route-Schutz Middleware
|
||||
- `/lib/webauthn.ts` - Passkey-Logik (Registrierung & Anmeldung, WebAuthn)
|
||||
- `/lib/passkeys.ts` - Datenbankzugriff auf die Tabelle `ausgaben_passkeys`
|
||||
|
||||
### 2. UI Komponenten (wiederverwendbar)
|
||||
- `/app/login/page.tsx` - Login-Seite
|
||||
- `/app/login/page.tsx` - Login-Seite (Passwort + „Mit Passkey anmelden")
|
||||
- `/app/login/actions.ts` - Server Actions für Login/Logout
|
||||
- `/components/LogoutButton.tsx` - Logout-Button Komponente
|
||||
- `/components/Passkeys.tsx` - Verwaltung der eigenen Passkeys (Tab *Einstellungen*)
|
||||
|
||||
### 3. API-Routen (Passkeys)
|
||||
- `/app/api/passkey/route.ts` - eigene Passkeys auflisten (GET) / löschen (DELETE)
|
||||
- `/app/api/passkey/register/route.ts` - Passkey registrieren (Session erforderlich)
|
||||
- `/app/api/passkey/authenticate/route.ts` - Anmeldung per Passkey (öffentlich)
|
||||
|
||||
## Installation in neuen Projekten
|
||||
|
||||
@@ -20,6 +28,9 @@ Diese Authentifizierungslösung kann einfach in andere Next.js Projekte übernom
|
||||
```bash
|
||||
npm install jose bcryptjs
|
||||
npm install --save-dev @types/bcryptjs
|
||||
|
||||
# Für Passkeys (WebAuthn):
|
||||
npm install @simplewebauthn/server @simplewebauthn/browser
|
||||
```
|
||||
|
||||
### 2. Dateien kopieren
|
||||
@@ -55,6 +66,11 @@ AUTH_USERS=admin:$2b$10$DKLO7uQPmdAw9Z64NChro...,user1:$2b$10$K613Z70Hodr6xyEh10
|
||||
|
||||
# Secret Key für JWT (unbedingt ändern in Production!)
|
||||
AUTH_SECRET=your-super-secret-key-change-this
|
||||
|
||||
# Passkeys (WebAuthn) — RP_ID = nur der Host, RP_ORIGIN = volle URL
|
||||
RP_ID=ausgaben.fuerst-stuttgart.de
|
||||
RP_ORIGIN=https://ausgaben.fuerst-stuttgart.de
|
||||
RP_NAME=Ausgaben-Log
|
||||
```
|
||||
|
||||
### 5. Logout-Button einbinden (optional)
|
||||
@@ -94,8 +110,21 @@ const SESSION_DURATION = 7 * 24 * 60 * 60 * 1000; // 7 Tage
|
||||
### Geschützte Routen anpassen
|
||||
Editiere in `middleware.ts` die `publicPaths`:
|
||||
```ts
|
||||
const publicPaths = ['/login', '/public-page'];
|
||||
const publicPaths = ['/login', '/api/passkey/authenticate', '/public-page'];
|
||||
```
|
||||
Die Passkey-Anmeldung muss ohne Session erreichbar sein.
|
||||
|
||||
### Passkeys verwalten
|
||||
- **Registrieren**: angemeldet im Tab *Einstellungen* → „Passkey hinzufügen".
|
||||
- **Anmelden**: auf der Login-Seite „Mit Passkey anmelden".
|
||||
- **Speicherung**: Tabelle `ausgaben_passkeys` (siehe `create_table.sql`), wird beim
|
||||
ersten Zugriff automatisch angelegt, sofern der DB-Benutzer CREATE-Rechte hat.
|
||||
**Wichtig bei Übernahme in ein anderes Projekt**: Teilen sich mehrere Apps eine
|
||||
Datenbank, braucht jede App einen eigenen Tabellennamen (`TABLE` in
|
||||
`lib/passkeys.ts`) — sonst sehen und löschen sie gegenseitig ihre Passkeys.
|
||||
- `RP_ID` muss exakt dem Hostnamen entsprechen (ohne Protokoll/Port). Ändert sich
|
||||
`RP_ID`, werden bereits registrierte Passkeys ungültig.
|
||||
- WebAuthn funktioniert nur über **HTTPS** oder auf `localhost`.
|
||||
|
||||
## Sicherheitshinweise
|
||||
|
||||
|
||||
Reference in New Issue
Block a user