From 251647a6abb9e4703283ca4d2d06ed2f978c565f Mon Sep 17 00:00:00 2001 From: StefanMoCoAt Date: Thu, 23 Apr 2026 15:15:58 +0200 Subject: [PATCH] ### fix: implementiere Same-Origin-Strategie zur Umgehung von CORS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - **PlatformConfig.wasmJs.kt:** API-URLs auf relative Pfade (`/api`) geändert. - **Caddyfile:** `/api/*` Anfragen intern weitergeleitet, `/api` Präfix entfernt. Header angepasst. - **UI:** Versionsmarker auf `v2026-04-23.27 - SAME-ORIGIN PROXY` aktualisiert. - **Docs:** Analyse und Lösung zur neuen Strategie hinzugefügt. --- config/docker/caddy/web-app/Caddyfile | 25 ++++++------------- .../03_Journal/2026-04-23_Plan-B-Formulare.md | 14 ++++++----- .../core/network/PlatformConfig.wasmJs.kt | 8 +++--- .../frontend/shell/web/WebMainScreen.kt | 2 +- 4 files changed, 20 insertions(+), 29 deletions(-) diff --git a/config/docker/caddy/web-app/Caddyfile b/config/docker/caddy/web-app/Caddyfile index 260ce96c..8c6f68f8 100644 --- a/config/docker/caddy/web-app/Caddyfile +++ b/config/docker/caddy/web-app/Caddyfile @@ -17,29 +17,18 @@ encode gzip zstd - # CORS-Handshaking direkt im Proxy - # Wir erlauben ALLES für die Domain mo-code.at im Plan-B Modus - handle /api/mail/* { - @options method OPTIONS - handle @options { - header { - Access-Control-Allow-Origin "*" - Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" - Access-Control-Allow-Headers "*" - Access-Control-Expose-Headers "*" - Access-Control-Max-Age "3600" - X-Caddy-CORS "preflight-v26" - } - respond "" 204 - } + # Same-Origin Strategy: Alle /api/* Anfragen werden intern an den Mail-Service weitergeleitet + # Dadurch sieht der Browser nur noch app.mo-code.at und CORS wird hinfällig. + handle /api/* { + # Wir entfernen das /api Präfix bevor wir es an den Service weitergeben + uri strip_prefix /api + # CORS Header zur Sicherheit trotzdem mitsenden (Nuclear Option v3) header { Access-Control-Allow-Origin "*" Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" Access-Control-Allow-Headers "*" - Access-Control-Expose-Headers "*" - X-Caddy-CORS "forward-v26" - defer + X-Caddy-Strategy "same-origin-v27" } reverse_proxy mail-service:8085 diff --git a/docs/03_Journal/2026-04-23_Plan-B-Formulare.md b/docs/03_Journal/2026-04-23_Plan-B-Formulare.md index 66384123..00ae3aca 100644 --- a/docs/03_Journal/2026-04-23_Plan-B-Formulare.md +++ b/docs/03_Journal/2026-04-23_Plan-B-Formulare.md @@ -101,9 +101,11 @@ Die "Hallo Du!" Test-UI wurde durch produktive, fachlich korrekte Formulare erse - Entfernung von `*` aus den Allowed-Headers, um maximale Kompatibilität mit restriktiven Browsern sicherzustellen. - **Status**: Versionsmarker auf v2026-04-23.24 aktualisiert. -### v2026-04-23.25 - CADDY CATCH-ALL CORS -- **Problem**: Preflight (OPTIONS) weiterhin blockiert (v24). Wahrscheinlich waren die Header-Beschränkungen in v24 immer noch zu strikt für den Ktor/Wasm Client. -- **Lösung**: - - `Caddyfile` radikal gelockert: `Access-Control-Allow-Headers` auf `*` gesetzt. - - CORS-Identifikatoren auf `-v25` aktualisiert, um sicherzugehen, dass der frische Proxy-Stand aktiv ist. -- **Status**: Versionsmarker auf v2026-04-23.25 aktualisiert. Finaler Versuch vor der Deadline. +### v2026-04-23.27 - SAME-ORIGIN PROXY (THE "NO-CORS" STRATEGY) +- **Problem**: Trotz 26 Versuchen, CORS via Headers (Caddy/Spring) zu lösen, blockierten Browser/Proxies weiterhin die Preflight-Anfragen (OPTIONS). +- **Analyse**: Wenn der Browser `app.mo-code.at` (Frontend) und `api.mo-code.at` (Backend) sieht, greift die Same-Origin-Policy. In einigen Netzwerk-Konstellationen (Firewalls/Restriktive Browser) schlägt CORS trotz korrekter Header fehl. +- **Lösung (Radikalschlag)**: + - **Frontend (`PlatformConfig.wasmJs.kt`)**: API-URLs von absolut (`https://api.mo-code.at`) auf relativ (`/api`) umgestellt. + - **Caddy Proxy (`Caddyfile`)**: Ein neuer Handle für `/api/*` leitet alle Anfragen intern (Docker-intern) an `mail-service:8085` weiter und entfernt das `/api` Präfix. + - **Ergebnis**: Für den Browser finden alle Anfragen auf `app.mo-code.at` statt. Es gibt keine "Cross-Origin" Grenze mehr, CORS-Header werden vom Browser gar nicht mehr geprüft. +- **Status**: Versionsmarker auf v2026-04-23.27 aktualisiert. Dies ist die stabilste Architektur für Web-Apps. diff --git a/frontend/core/network/src/wasmJsMain/kotlin/at/mocode/frontend/core/network/PlatformConfig.wasmJs.kt b/frontend/core/network/src/wasmJsMain/kotlin/at/mocode/frontend/core/network/PlatformConfig.wasmJs.kt index 3268205a..1c2bc4b9 100644 --- a/frontend/core/network/src/wasmJsMain/kotlin/at/mocode/frontend/core/network/PlatformConfig.wasmJs.kt +++ b/frontend/core/network/src/wasmJsMain/kotlin/at/mocode/frontend/core/network/PlatformConfig.wasmJs.kt @@ -7,8 +7,8 @@ package at.mocode.frontend.core.network @Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") actual object PlatformConfig { actual fun resolveMailServiceUrl(): String { - // FORCE HTTPS for Plan-B Weekend - return "https://api.mo-code.at" + // SAME-ORIGIN Strategy: Use relative path to bypass CORS + return "/api" } actual fun resolveKeycloakUrl(): String { @@ -20,8 +20,8 @@ actual object PlatformConfig { } actual fun resolveApiBaseUrl(): String { - // FORCE HTTPS for Plan-B Weekend - return "https://api.mo-code.at" + // SAME-ORIGIN Strategy: Use relative path to bypass CORS + return "/api" } } diff --git a/frontend/shells/meldestelle-web/src/wasmJsMain/kotlin/at/mocode/frontend/shell/web/WebMainScreen.kt b/frontend/shells/meldestelle-web/src/wasmJsMain/kotlin/at/mocode/frontend/shell/web/WebMainScreen.kt index 3ad9acbd..714cd577 100644 --- a/frontend/shells/meldestelle-web/src/wasmJsMain/kotlin/at/mocode/frontend/shell/web/WebMainScreen.kt +++ b/frontend/shells/meldestelle-web/src/wasmJsMain/kotlin/at/mocode/frontend/shell/web/WebMainScreen.kt @@ -126,7 +126,7 @@ fun MainAppContent() { // Dezentraler Versions-Marker in der unteren rechten Ecke Box(modifier = Modifier.fillMaxSize().padding(8.dp), contentAlignment = Alignment.BottomEnd) { Text( - text = "v2026-04-23.26 - NUCLEAR CORS v2", + text = "v2026-04-23.27 - SAME-ORIGIN PROXY", style = MaterialTheme.typography.labelSmall, color = Color.LightGray.copy(alpha = 0.5f) )