- Einbindung eines komplett überarbeiteten Onboarding-Screens mit validierten Eingaben für Gerätename, Sicherheitsschlüssel und Backup-Pfad. - `SettingsManager` eingeführt zur Speicherung der Onboarding-Daten in `settings.json`. - Navigation verbessert: Onboarding-Workflow startet, wenn Konfiguration fehlt; neues "Setup"-Icon in der Navigationsleiste hinzugefügt. - Backend: Geräte-API und `DeviceSecurityFilter` für Authentifizierung per Sicherheitsschlüssel implementiert. Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
2.2 KiB
Onboarding-Backend & Desktop-Identität
Dieses Dokument beschreibt die Backend-Infrastruktur für die Identifizierung und Authentifizierung von Desktop-Clients ("Meldestelle-Biest").
🚀 Übersicht
Im Gegensatz zur Web-App (die via Keycloak/JWT authentifiziert) nutzen die Desktop-Instanzen für die Offline-Synchronisation eine Identität, die während des Onboarding-Prozesses lokal vergeben und am Server registriert wird.
🛡️ Authentifizierungs-Mechanismus
Die Authentifizierung erfolgt über zwei HTTP-Header, die bei jedem Request vom Desktop-Client mitgesendet werden müssen:
| Header | Beschreibung | Beispiel |
|---|---|---|
X-Device-Name |
Der beim Onboarding vergebene Gerätename | Meldestelle-PC-1 |
X-Security-Key |
Der beim Onboarding vergebene Sicherheitsschlüssel | secret-key-123 |
DeviceSecurityFilter
Ein Custom-Security-Filter (DeviceSecurityFilter) im Backend extrahiert diese Header und setzt einen Spring Security
Kontext mit der Authority ROLE_DEVICE.
🛰️ API-Endpunkte (Identity Service)
1. Gerät registrieren
Wird beim Abschluss des Onboarding-Screens aufgerufen.
- URL:
POST /api/v1/devices/register - Body:
{
"name": "Meldestelle-PC-1",
"securityKeyHash": "...",
"role": "MASTER"
}
- Hinweis: Dieser Endpunkt ist
permitAll(), um die Erstregistrierung zu ermöglichen.
2. Gerät abrufen
- URL:
GET /api/v1/devices/{name} - Auth: Erfordert
ROLE_DEVICEoderJWT.
💾 Datenmodell (Exposed)
Die Tabelle identity_devices speichert die registrierten Instanzen:
id: Eindeutige UUID.name: Gerätename (eindeutig).security_key_hash: Der Sicherheitsschlüssel (gehasht).role:MASTERoderCLIENT.last_sync_at: Zeitstempel der letzten erfolgreichen Synchronisation.
🛠️ Local Test-Setup
Für lokale Tests mit curl:
curl -X GET http://localhost:8081/api/v1/devices/Meldestelle-PC-1 \
-H "X-Device-Name: Meldestelle-PC-1" \
-H "X-Security-Key: secret-key-123"