Document admin login endpoint
This commit is contained in:
@@ -25,3 +25,5 @@
|
||||
- [019 - Bootstrap-Admin und erste Seed-Daten](019-bootstrap-admin-und-erste-seed-daten.md)
|
||||
|
||||
- [020 - Bootstrap-Seed-Script und Admin-Passwort](020-bootstrap-seed-script-und-admin-passwort.md)
|
||||
|
||||
- [021 - Auth-Grundlage und Admin-Login](021-auth-grundlage-admin-login.md)
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
# 021 - Auth-Grundlage und Admin-Login
|
||||
|
||||
## Ziel
|
||||
|
||||
Der Server wurde um eine erste Auth-Grundlage erweitert.
|
||||
|
||||
Implementiert wurde ein Login-Endpunkt für den vorhandenen Bootstrap-Admin.
|
||||
|
||||
## Neuer Endpunkt
|
||||
|
||||
POST /api/v1/auth/login
|
||||
|
||||
Request:
|
||||
|
||||
{
|
||||
"username": "admin",
|
||||
"password": "<lokales Passwort>"
|
||||
}
|
||||
|
||||
Response bei Erfolg:
|
||||
|
||||
{
|
||||
"status": "ok",
|
||||
"tokenType": "Bearer",
|
||||
"accessToken": "...",
|
||||
"refreshToken": "...",
|
||||
"expiresInSeconds": 3600,
|
||||
"user": {
|
||||
"id": "...",
|
||||
"username": "admin",
|
||||
"displayName": "RUVNOX Admin",
|
||||
"role": "admin"
|
||||
}
|
||||
}
|
||||
|
||||
## Neue Dateien
|
||||
|
||||
Security:
|
||||
|
||||
- src/main/kotlin/de/ruvnox/tactical/security/PasswordHash.kt
|
||||
- src/main/kotlin/de/ruvnox/tactical/security/TokenSupport.kt
|
||||
|
||||
API:
|
||||
|
||||
- src/main/kotlin/de/ruvnox/tactical/api/AuthDtos.kt
|
||||
- src/main/kotlin/de/ruvnox/tactical/api/AuthRoutes.kt
|
||||
|
||||
Repository:
|
||||
|
||||
- src/main/kotlin/de/ruvnox/tactical/repository/SessionRepository.kt
|
||||
|
||||
Geändert:
|
||||
|
||||
- UserRepository.kt
|
||||
- Main.kt
|
||||
|
||||
## Passwortprüfung
|
||||
|
||||
Der Server kann jetzt PBKDF2-SHA256-Hashes im Format des Bootstrap-Scripts prüfen:
|
||||
|
||||
pbkdf2_sha256$iterations$salt_base64$hash_base64
|
||||
|
||||
Die Prüfung nutzt PBKDF2WithHmacSHA256 und konstantzeitnahen Vergleich über MessageDigest.isEqual.
|
||||
|
||||
## Token
|
||||
|
||||
Beim Login werden erzeugt:
|
||||
|
||||
- accessToken
|
||||
- refreshToken
|
||||
|
||||
Der refreshToken wird nicht im Klartext gespeichert.
|
||||
|
||||
In auth_sessions wird gespeichert:
|
||||
|
||||
- refresh_token_hash = SHA-256(refreshToken)
|
||||
- user_id
|
||||
- expires_at
|
||||
- created_at
|
||||
- last_seen_at
|
||||
|
||||
## Datenbank
|
||||
|
||||
Genutzte Tabelle:
|
||||
|
||||
auth_sessions
|
||||
|
||||
Nach erfolgreichem Login existiert mindestens eine aktive Session.
|
||||
|
||||
## Sicherheitshinweise
|
||||
|
||||
Dies ist eine erste Auth-Grundlage.
|
||||
|
||||
Noch nicht final umgesetzt:
|
||||
|
||||
- geschützte Endpunkte
|
||||
- Bearer-Token-Prüfung
|
||||
- Refresh-Flow
|
||||
- Logout
|
||||
- Rollenprüfung auf Routen
|
||||
- Rate-Limiting
|
||||
- Brute-Force-Schutz
|
||||
- Session-Cleanup
|
||||
|
||||
## Verifikation
|
||||
|
||||
Login wurde öffentlich geprüft:
|
||||
|
||||
POST https://tactical.ruvnox.de/api/v1/auth/login
|
||||
|
||||
Tokens wurden in der Ausgabe maskiert.
|
||||
|
||||
## Git-Commit
|
||||
|
||||
tactical-server:
|
||||
|
||||
Add admin login endpoint
|
||||
|
||||
## Abschlussstand
|
||||
|
||||
- Passwort-Hash-Verifikation implementiert
|
||||
- Login-DTOs implementiert
|
||||
- Login-Route implementiert
|
||||
- Session-Erzeugung implementiert
|
||||
- Build erfolgreich
|
||||
- Deployment erfolgreich
|
||||
- Login erfolgreich geprüft
|
||||
- Server-Repo gepusht
|
||||
- Docs-Repo aktualisiert
|
||||
Reference in New Issue
Block a user