### fix: implementiere Same-Origin-Strategie zur Umgehung von CORS
All checks were successful
Build and Publish Docker Images / build-and-push (., backend/services/mail/Dockerfile, mail-service, mail-service) (push) Successful in 5m38s
Build and Publish Docker Images / build-and-push (., config/docker/caddy/web-app/Dockerfile, web-app, web-app) (push) Successful in 4m35s

- **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.
This commit is contained in:
Stefan Mogeritsch 2026-04-23 15:15:58 +02:00
parent 277254ebbd
commit 251647a6ab
4 changed files with 20 additions and 29 deletions

View File

@ -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

View File

@ -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.

View File

@ -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"
}
}

View File

@ -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)
)