oauth-token check #1

Open
opened 2026-10-06 08:24:40 +02:00 by da · 3 comments

token jedes mal (zumindest beim Aufruf der Hauptseite) checken, nicht nur nach gültigem Session-Cookie prüfen.
Api-Calls können auch nur mit gültigem Session-Cookie erfolgen. Nochmal nachdenken bzgl. security

token jedes mal (zumindest beim Aufruf der Hauptseite) checken, nicht nur nach gültigem Session-Cookie prüfen. Api-Calls können auch nur mit gültigem Session-Cookie erfolgen. Nochmal nachdenken bzgl. security
Author

in PHP in etwa so:

-// check if user is logged in
-if (isset($_SESSION['id_token'])) {
+// check if user is logged in UND das Token noch gültig ist (exp-Claim).
+// Eine bloß vorhandene Session reicht nicht - sie kann die tatsächliche
+// Token-Gültigkeit bei Authentik bereits überlebt haben.
+if (isset($_SESSION['id_token']) && !isTokenExpired($_SESSION['id_token'])) {
header('Location: card.php');
/echo "Willkommen,";
echo '
Ausweis anzeigen';
echo '
Ausweis download (pdf)';
echo '
Abmelden';
/
} else {

in PHP in etwa so: <?php /* auth.php - gemeinsame Hilfsfunktion für index.php, card.php und qrcode.php. Prüft das 'exp'-Claim (Unix-Timestamp) im ID-Token, damit die App-Session nicht länger lebt als die tatsächliche Token-Gültigkeit bei Authentik. Die reine Existenz von $_SESSION['id_token'] sagt nichts über dessen Ablauf aus - das muss aktiv aus dem JWT-Payload gelesen werden. */ function isTokenExpired($id_token) { if (empty($id_token)) { return true; } $parts = explode('.', $id_token); if (count($parts) !== 3) { return true; // kein gültiges JWT-Format } $payload = json_decode(base64_decode(strtr($parts[1], '-_', '+/')), true); if (!is_array($payload) || !isset($payload['exp'])) { return true; } return $payload['exp'] < time(); } /* Beendet die lokale Session, falls kein Token vorhanden oder abgelaufen. $redirectTo: wohin bei fehlender/abgelaufener Session weitergeleitet wird. */ function requireValidSession($redirectTo = 'index.php') { if (!isset($_SESSION['id_token']) || isTokenExpired($_SESSION['id_token'])) { $_SESSION = array(); session_destroy(); header('Location: ' . $redirectTo); exit(); } } ?> -// check if user is logged in -if (isset($_SESSION['id_token'])) { +// check if user is logged in UND das Token noch gültig ist (exp-Claim). +// Eine bloß vorhandene Session reicht nicht - sie kann die tatsächliche +// Token-Gültigkeit bei Authentik bereits überlebt haben. +if (isset($_SESSION['id_token']) && !isTokenExpired($_SESSION['id_token'])) { header('Location: card.php'); /*echo "Willkommen,"; echo '<br><a href="card.php">Ausweis anzeigen</a>'; echo '<br><a href="card.php?pdf=true" download="schuelerausweis.pdf">Ausweis download (pdf)</a>'; echo '<br><a href="logout.php">Abmelden</a>';*/ } else {
trs self-assigned this 2026-10-09 06:14:29 +02:00
trs added reference beta 2026-10-09 06:16:59 +02:00
Owner

Die Ablaufprüfung ist umgesetzt: oidc.py akzeptiert Benutzer-Claims nur, wenn eine gültige, noch nicht abgelaufene expires_at-Zeit in der Session liegt. Abgelaufene oder unvollständige Auth-Daten werden entfernt; ein laufender OIDC-Login bleibt erhalten. Hauptseite und geschützte APIs verwenden diesen zentralen Check. Der Callback speichert expires_at bereits im aktuellen HEAD in auth.py.

Wichtig: Eine externe Keycloak-Abmeldung wird mit dieser Ablaufprüfung spätestens beim Ablauf des Access-Tokens erkannt, nicht zwingend sofort. Für sofortige Invalidierung wären etwa Token-Introspection oder ein OIDC-Logout-Callback mit sicherer serverseitiger Tokenablage nötig.

Erstmal testen und dann weiter schauen

Die Ablaufprüfung ist umgesetzt: oidc.py akzeptiert Benutzer-Claims nur, wenn eine gültige, noch nicht abgelaufene expires_at-Zeit in der Session liegt. Abgelaufene oder unvollständige Auth-Daten werden entfernt; ein laufender OIDC-Login bleibt erhalten. Hauptseite und geschützte APIs verwenden diesen zentralen Check. Der Callback speichert expires_at bereits im aktuellen HEAD in auth.py. Wichtig: Eine externe Keycloak-Abmeldung wird mit dieser Ablaufprüfung spätestens beim Ablauf des Access-Tokens erkannt, nicht zwingend sofort. Für sofortige Invalidierung wären etwa Token-Introspection oder ein OIDC-Logout-Callback mit sicherer serverseitiger Tokenablage nötig. Erstmal testen und dann weiter schauen
Owner

=== MaßnahmenMonitor ===
Projekt: /var/www/mm
Git aktualisieren...
Bereits aktuell.
Python-Abhängigkeiten aktualisieren...
Requirement already satisfied: fastapi in ./.venv/lib/python3.13/site-packages (from -r /var/www/mm/requirements.txt (line 1)) (0.141.1)
Requirement already satisfied: uvicorn in ./.venv/lib/python3.13/site-packages (from -r /var/www/mm/requirements.txt (line 2)) (0.54.0)
Requirement already satisfied: authlib in ./.venv/lib/python3.13/site-packages (from -r /var/www/mm/requirements.txt (line 3)) (1.8.0)
Requirement already satisfied: httpx in ./.venv/lib/python3.13/site-packages (from -r /var/www/mm/requirements.txt (line 4)) (0.28.1)
Requirement already satisfied: itsdangerous in ./.venv/lib/python3.13/site-packages (from -r /var/www/mm/requirements.txt (line 5)) (2.2.0)
Requirement already satisfied: starlette>=0.46.0 in ./.venv/lib/python3.13/site-packages (from fastapi->-r /var/www/mm/requirements.txt (line 1)) (1.7.0)
Requirement already satisfied: pydantic>=2.9.0 in ./.venv/lib/python3.13/site-packages (from fastapi->-r /var/www/mm/requirements.txt (line 1)) (2.13.5)
Requirement already satisfied: typing-extensions>=4.8.0 in ./.venv/lib/python3.13/site-packages (from fastapi->-r /var/www/mm/requirements.txt (line 1)) (4.16.0)
Requirement already satisfied: typing-inspection>=0.4.2 in ./.venv/lib/python3.13/site-packages (from fastapi->-r /var/www/mm/requirements.txt (line 1)) (0.4.4)
Requirement already satisfied: annotated-doc>=0.0.2 in ./.venv/lib/python3.13/site-packages (from fastapi->-r /var/www/mm/requirements.txt (line 1)) (0.0.5)
Requirement already satisfied: click>=7.0 in ./.venv/lib/python3.13/site-packages (from uvicorn->-r /var/www/mm/requirements.txt (line 2)) (8.5.0)
Requirement already satisfied: h11>=0.8 in ./.venv/lib/python3.13/site-packages (from uvicorn->-r /var/www/mm/requirements.txt (line 2)) (0.16.0)
Requirement already satisfied: cryptography>=45.0.1 in ./.venv/lib/python3.13/site-packages (from authlib->-r /var/www/mm/requirements.txt (line 3)) (50.0.1)
Requirement already satisfied: joserfc>=1.6.1 in ./.venv/lib/python3.13/site-packages (from authlib->-r /var/www/mm/requirements.txt (line 3)) (1.7.5)
Requirement already satisfied: anyio in ./.venv/lib/python3.13/site-packages (from httpx->-r /var/www/mm/requirements.txt (line 4)) (4.15.1)
Requirement already satisfied: certifi in ./.venv/lib/python3.13/site-packages (from httpx->-r /var/www/mm/requirements.txt (line 4)) (2026.7.22)
Requirement already satisfied: httpcore==1.* in ./.venv/lib/python3.13/site-packages (from httpx->-r /var/www/mm/requirements.txt (line 4)) (1.0.9)
Requirement already satisfied: idna in ./.venv/lib/python3.13/site-packages (from httpx->-r /var/www/mm/requirements.txt (line 4)) (3.20)
Requirement already satisfied: cffi>=2.0.0 in ./.venv/lib/python3.13/site-packages (from cryptography>=45.0.1->authlib->-r /var/www/mm/requirements.txt (line 3)) (2.1.1)
Requirement already satisfied: pycparser in ./.venv/lib/python3.13/site-packages (from cffi>=2.0.0->cryptography>=45.0.1->authlib->-r /var/www/mm/requirements.txt (line 3)) (3.0)
Requirement already satisfied: annotated-types>=0.6.0 in ./.venv/lib/python3.13/site-packages (from pydantic>=2.9.0->fastapi->-r /var/www/mm/requirements.txt (line 1)) (0.8.0)
Requirement already satisfied: pydantic-core==2.46.5 in ./.venv/lib/python3.13/site-packages (from pydantic>=2.9.0->fastapi->-r /var/www/mm/requirements.txt (line 1)) (2.46.5)
Kein laufender MaßnahmenMonitor-Prozess gefunden.
Starte MaßnahmenMonitor mit den Einstellungen aus config/config.py...
FEHLER: MaßnahmenMonitor konnte nicht gestartet werden. Letzte Logzeilen:
Traceback (most recent call last):
File "/var/www/mm/main.py", line 9, in
from app.auth import router as auth_router
File "/var/www/mm/app/auth.py", line 4, in
from app.oidc import get_session_user, oauth
File "/var/www/mm/app/oidc.py", line 30
<<<<<<< HEAD
^^
SyntaxError: invalid syntax

=== MaßnahmenMonitor === Projekt: /var/www/mm Git aktualisieren... Bereits aktuell. Python-Abhängigkeiten aktualisieren... Requirement already satisfied: fastapi in ./.venv/lib/python3.13/site-packages (from -r /var/www/mm/requirements.txt (line 1)) (0.141.1) Requirement already satisfied: uvicorn in ./.venv/lib/python3.13/site-packages (from -r /var/www/mm/requirements.txt (line 2)) (0.54.0) Requirement already satisfied: authlib in ./.venv/lib/python3.13/site-packages (from -r /var/www/mm/requirements.txt (line 3)) (1.8.0) Requirement already satisfied: httpx in ./.venv/lib/python3.13/site-packages (from -r /var/www/mm/requirements.txt (line 4)) (0.28.1) Requirement already satisfied: itsdangerous in ./.venv/lib/python3.13/site-packages (from -r /var/www/mm/requirements.txt (line 5)) (2.2.0) Requirement already satisfied: starlette>=0.46.0 in ./.venv/lib/python3.13/site-packages (from fastapi->-r /var/www/mm/requirements.txt (line 1)) (1.7.0) Requirement already satisfied: pydantic>=2.9.0 in ./.venv/lib/python3.13/site-packages (from fastapi->-r /var/www/mm/requirements.txt (line 1)) (2.13.5) Requirement already satisfied: typing-extensions>=4.8.0 in ./.venv/lib/python3.13/site-packages (from fastapi->-r /var/www/mm/requirements.txt (line 1)) (4.16.0) Requirement already satisfied: typing-inspection>=0.4.2 in ./.venv/lib/python3.13/site-packages (from fastapi->-r /var/www/mm/requirements.txt (line 1)) (0.4.4) Requirement already satisfied: annotated-doc>=0.0.2 in ./.venv/lib/python3.13/site-packages (from fastapi->-r /var/www/mm/requirements.txt (line 1)) (0.0.5) Requirement already satisfied: click>=7.0 in ./.venv/lib/python3.13/site-packages (from uvicorn->-r /var/www/mm/requirements.txt (line 2)) (8.5.0) Requirement already satisfied: h11>=0.8 in ./.venv/lib/python3.13/site-packages (from uvicorn->-r /var/www/mm/requirements.txt (line 2)) (0.16.0) Requirement already satisfied: cryptography>=45.0.1 in ./.venv/lib/python3.13/site-packages (from authlib->-r /var/www/mm/requirements.txt (line 3)) (50.0.1) Requirement already satisfied: joserfc>=1.6.1 in ./.venv/lib/python3.13/site-packages (from authlib->-r /var/www/mm/requirements.txt (line 3)) (1.7.5) Requirement already satisfied: anyio in ./.venv/lib/python3.13/site-packages (from httpx->-r /var/www/mm/requirements.txt (line 4)) (4.15.1) Requirement already satisfied: certifi in ./.venv/lib/python3.13/site-packages (from httpx->-r /var/www/mm/requirements.txt (line 4)) (2026.7.22) Requirement already satisfied: httpcore==1.* in ./.venv/lib/python3.13/site-packages (from httpx->-r /var/www/mm/requirements.txt (line 4)) (1.0.9) Requirement already satisfied: idna in ./.venv/lib/python3.13/site-packages (from httpx->-r /var/www/mm/requirements.txt (line 4)) (3.20) Requirement already satisfied: cffi>=2.0.0 in ./.venv/lib/python3.13/site-packages (from cryptography>=45.0.1->authlib->-r /var/www/mm/requirements.txt (line 3)) (2.1.1) Requirement already satisfied: pycparser in ./.venv/lib/python3.13/site-packages (from cffi>=2.0.0->cryptography>=45.0.1->authlib->-r /var/www/mm/requirements.txt (line 3)) (3.0) Requirement already satisfied: annotated-types>=0.6.0 in ./.venv/lib/python3.13/site-packages (from pydantic>=2.9.0->fastapi->-r /var/www/mm/requirements.txt (line 1)) (0.8.0) Requirement already satisfied: pydantic-core==2.46.5 in ./.venv/lib/python3.13/site-packages (from pydantic>=2.9.0->fastapi->-r /var/www/mm/requirements.txt (line 1)) (2.46.5) Kein laufender MaßnahmenMonitor-Prozess gefunden. Starte MaßnahmenMonitor mit den Einstellungen aus config/config.py... FEHLER: MaßnahmenMonitor konnte nicht gestartet werden. Letzte Logzeilen: Traceback (most recent call last): File "/var/www/mm/main.py", line 9, in <module> from app.auth import router as auth_router File "/var/www/mm/app/auth.py", line 4, in <module> from app.oidc import get_session_user, oauth File "/var/www/mm/app/oidc.py", line 30 <<<<<<< HEAD ^^ SyntaxError: invalid syntax
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
trs/MassnahmenMonitor#1
No description provided.