38 lines
1.8 KiB
JavaScript
38 lines
1.8 KiB
JavaScript
/*
|
|
* E9 (Umsetzungsauftrag Teil E): der gleitende Idle-Timeout des Session-
|
|
* Cookies (siehe app/auth/deps.py::get_current_user, refresh_session_token)
|
|
* wird nur bei regulaeren HTTP-Anfragen verlaengert. Ein WebSocket-Handshake
|
|
* kann das nicht (WebSockets erlauben nach dem Handshake kein Set-Cookie
|
|
* mehr, siehe get_current_user_ws()) -- ein Benutzer, der eine Stunde
|
|
* ausschliesslich in einem offenen Terminal- oder RDP-Tab arbeitet, haette
|
|
* sonst ein abgelaufenes Cookie: die laufende Sitzung selbst laeuft zwar
|
|
* weiter, aber jede WEITERE Aktion (zweite Sitzung oeffnen, Dateitransfer,
|
|
* Katalog neu laden) scheitert mit "Session abgelaufen".
|
|
*
|
|
* Fix: waehrend ein Sitzungstab (Terminal/RDP) offen ist, periodisch einen
|
|
* billigen, bereits authentifizierten HTTP-Endpunkt aufrufen (GET /auth/me,
|
|
* siehe app/auth/routes.py) -- das durchlaeuft dieselbe get_current_user()-
|
|
* Dependency wie jede andere Anfrage und verlaengert den Cookie ganz
|
|
* regulaer, ohne einen eigenen Endpunkt oder Serveraenderungen zu brauchen.
|
|
*
|
|
* Intervall: deutlich unter dem serverseitig konfigurierten
|
|
* session_idle_timeout_s (Standard 900s/15min, app/config.py) -- 3 Minuten
|
|
* Sicherheitsmarge reichen fuer jede sinnvolle Konfiguration.
|
|
*/
|
|
(() => {
|
|
"use strict";
|
|
|
|
const KEEPALIVE_INTERVAL_MS = 3 * 60 * 1000;
|
|
|
|
function ping() {
|
|
fetch("/auth/me", { method: "GET", credentials: "same-origin" }).catch(() => {
|
|
// Absichtlich stumm: ein einzelner fehlgeschlagener Keepalive-Ping
|
|
// (z.B. kurzer Netzwerkaussetzer) soll die laufende Sitzung nicht
|
|
// stoeren -- schlaegt die Session tatsaechlich fehl, faellt das beim
|
|
// naechsten regulaeren Request (Dateitransfer, Reload, ...) ohnehin auf.
|
|
});
|
|
}
|
|
|
|
window.setInterval(ping, KEEPALIVE_INTERVAL_MS);
|
|
})();
|