Migration: Sensible Daten nicht mehr in URLs übergeben
Übersicht, welche Frontend-Requests aktuell E-Mail/Device-ID oder ähnliche Daten in der URL transportieren, und wie der Server erweitert werden muss, um Header-basierte Varianten sauber zu bedienen.
Betroffene Frontend-Stellen (URL mit Nutzerdaten)
frontend/src/services/dataservice.js
checkConditions(email, deviceId)→ GETcheck-conditions/:email/:deviceIdfrontend/src/services/userDataLoader.js
loadProfileData→ GETmuc4taxiActivateUser/:email(perapiFetch, mit Auth-Headern, aber E-Mail steckt in der URL)frontend/src/Components/Profil.svelte
getActualUserFromDb→ GET${API_PREFIX}/muc4taxiActivateUser/:email(plain fetch, ohne Auth-Header)
markInvoicesAsSeen→ POST/invoices/mark-seen(E-Mail im Body, ok)frontend/src/services/invoiceService.js
getUnseenInvoices(email)→ GETinvoices/unseen?email=...
fetchInvoicesForEmail(email)→ GETinvoices?email=...(alle Varianten)
markInvoicesSeen(email)→ POST body (ok)- Admin-Bereich (weniger kritisch, aber ebenfalls Query-Params mit Mails):
frontend/src/Components/AdminArea/InvoiceProcessing.svelte→ GETinvoices/history?adminEmail=...,invoices/pending-users?adminEmail=...
frontend/src/Components/AdminArea/FeatureFeedback.svelte→ GETfeature-feedback/summary?adminEmail=...
Zielbild Frontend (Header statt URL-Params)
- E-Mail und Device-ID per Header schicken:
x-user-email: E-Mail des eingeloggten Nutzers/Adminsx-device-id: Geräte-ID/Fingerprint
- Für Such-/Filter-Parameter, die nicht identifizierend sind, können Query-Params bleiben.
Erforderliche Server-Erweiterungen
check-conditions
- Aktuell nur Legacy-Route
/:email/:deviceId. - Ergänzen:
router.get("/")(ggf. mitmembershipMiddlewareo.ä.), liestreq.headers["x-user-email"]undreq.headers["x-device-id"], ruft denselben Controller (getConditions) auf. Legacy-Route kann vorerst bestehen bleiben.
muc4taxiActivateUser
- Aktuell GET
/:email. - Ergänzen: GET
/(oder"/me") mitx-user-email/x-device-idaus den Headers; Controller nutzt Header stattreq.params.email. Legacy-Param-Route als Fallback belassen.
invoices (user-seitig)
- GET
invoices/unseen?email=...undinvoices?email=...auf Header umstellen:- Neue Routenvarianten ohne Query, lesen
x-user-email(Device-ID optional, falls Membership geprüft werden soll). - Query-Param-Variante vorerst als Fallback akzeptieren, bis Frontend umgestellt ist.
- Neue Routenvarianten ohne Query, lesen
- POST
invoices/mark-seenkann E-Mail weiter im Body haben; optional: wenn Body fehlt, E-Mail aus Header ziehen.
Admin-spezifische Endpoints mit adminEmail in Query
feature-feedback/summary,invoices/history,invoices/pending-usersetc.: Headerx-user-email(Admin) akzeptieren und optional Query behalten, bis Frontend umgestellt ist.
Empfohlene Migrationsschritte
-
Server zuerst erweitern
- Neue Header-basierte GETs für
check-conditionsundmuc4taxiActivateUser. - In den Controller-Funktionen: Wenn
req.paramsfehlen, aufreq.headers["x-user-email"]/req.headers["x-device-id"]ausweichen. - Invoice-/Admin-Endpoints: Header akzeptieren, Query weiter tolerieren.
- Neue Header-basierte GETs für
-
Frontend umstellen
checkConditionsindataservice.js: aufapiFetch("check-conditions", { headers: { "x-user-email": email, "x-device-id": deviceId } }).loadProfileData/Profil.svelte:muc4taxiActivateUserohne E-Mail in der URL, E-Mail per Header.invoiceService:invoices/unseenundinvoicesohne?email=, stattdessen Header;mark-seenkann so bleiben.- Admin-Requests (
feature-feedback/summary,invoices/history,pending-users): adminEmail per Header senden.
-
Übergangsphase
- Legacy-Routen/Querys vorerst beibehalten, aber deprecate.
- Logging/Monitoring: Header-basierte Pfade nutzen, 404/405 auf alten Pfaden beobachten.
-
Aufräumen
- Nach Umstellung Query/Param-Varianten entfernen.
- CORS-Allowed-Headers prüfen:
x-user-email,x-device-idsind bereits whitelisted inserver/config/config.js.
Rückfragen / offene Punkte
- Soll die Membership-Middleware auch für
check-conditions/muc4taxiActivateUsergreifen (Header-Variante)? Falls ja, Middleware vor den neuen Routen platzieren. - Dürfen Admin-Endpoints komplett auf Header-only umgestellt werden oder Query-Fallback behalten?