From 1371b89c936eb10229115403e4e10f10d16ad4a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BCdiger=20Rolf?= Date: Fri, 9 Oct 2026 04:17:50 +0200 Subject: [PATCH] =?UTF-8?q?fix(template):=20app-spezifische=20Cookie-Namen?= =?UTF-8?q?=20f=C3=BCr=20Session=20und=20CSRF=20(#22)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Browser trennen Cookies pro Host, nicht pro Port; parallel laufende Tools auf demselben Host haben sich sonst gegenseitig abgemeldet. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 20 +++++++++++++++++++ .../project/backend/config/settings.py.jinja | 6 ++++++ 2 files changed, 26 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 604bbbd..bb7b0cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,26 @@ Changelog ist die Upgrade-Anleitung für die Tools. ## [Unreleased] +### Template + +**App-spezifische Cookie-Namen für Session und CSRF** (#22): Browser trennen +Cookies pro Host, nicht pro Port. Tools, die parallel auf demselben Host laufen +(in der Entwicklung mehrere „-bar“-Tools auf `localhost`), überschrieben sich +gegenseitig `sessionid`/`csrftoken` – man war in den anderen Tools abgemeldet +(`403 "Anmeldedaten fehlen."`) und POSTs scheiterten an CSRF. Das Template +setzt jetzt `SESSION_COOKIE_NAME = "_sessionid"` und +`CSRF_COOKIE_NAME = "_csrftoken"`. `basicbar-auth` +(Silent Login, Back-Channel-Logout, `whoami` mit CSRF-Token) und +`basicbar-lti` setzen keine festen Cookie-Namen voraus; das Template-Frontend +liest den CSRF-Token aus `whoami`, nicht aus dem Cookie. + +Migration (bestehende Tools): in `backend/config/settings.py` die zwei Zeilen +ergänzen (Slug des Tools einsetzen). Wer das CSRF-Cookie im Frontend selbst +per Namen liest (z. B. `getCookie("csrftoken")`), stellt auf den neuen Namen +oder auf den Token aus `whoami` um. Beim Deploy werden alle Nutzenden einmal +abgemeldet (per Silent-SSO meist sofort wieder angemeldet). Bereits +übernommen: ausleihbar (virtUOS/ausleihbar#105), kalkulierbar. + ### @basicbar/ui (→ wird `ui/v0.7.2`) **Sicherheits-Fix `stripHtml` / `isEmptyHtml`** (#20): Beide parsten über diff --git a/template/project/backend/config/settings.py.jinja b/template/project/backend/config/settings.py.jinja index 31fed9c..864cd97 100644 --- a/template/project/backend/config/settings.py.jinja +++ b/template/project/backend/config/settings.py.jinja @@ -156,6 +156,12 @@ STATIC_ROOT = BASE_DIR / "staticfiles" MEDIA_URL = "media/" MEDIA_ROOT = BASE_DIR / "media" +# App-specific cookie names: browsers share cookies per host regardless of +# port, so other tools on the same host (e.g. several -bar tools on localhost +# in development) would overwrite "sessionid"/"csrftoken" and log each other out. +SESSION_COOKIE_NAME = "{{ project_slug }}_sessionid" +CSRF_COOKIE_NAME = "{{ project_slug }}_csrftoken" + # Behind a TLS-terminating reverse proxy in production: trust its forwarded # host/scheme so absolute URLs use https, and require secure cookies. if not DEBUG: