Auth: Magic Link Login + Globe-Zugangssteuerung

- Magic Link Login (E-Mail + 6-stelliger Code)
- JWT-basierte Session (24h)
- Prueft: is_active=1 UND globe_access=1
- Akzeptiert auch Monitor-JWT-Tokens (Kompatibilitaet)
- Globe-spezifisches E-Mail-Template (Dark Theme)
- Alle Daten-APIs hinter Auth-Middleware
- Login-Seite mit taktischem Design
- Auto-Redirect bei fehlendem/abgelaufenem Token
- Fetch-Wrapper injiziert Authorization Header automatisch
Dieser Commit ist enthalten in:
Claude Dev
2026-03-24 11:57:00 +01:00
Ursprung a22a4e70d1
Commit 338e082467
9 geänderte Dateien mit 487 neuen und 9 gelöschten Zeilen

Datei anzeigen

@@ -9,6 +9,23 @@
<link rel="stylesheet" href="/static/css/globe.css">
</head>
<body>
<script>
// Auth-Check: Ohne Token zum Login
if (!localStorage.getItem('globe_token')) { window.location.href = '/login'; }
// Auth-Header fuer alle Fetch-Calls
var _origFetch = window.fetch;
window.fetch = function(url, opts) {
opts = opts || {};
if (typeof url === 'string' && url.startsWith('/api/') && !url.includes('/auth/')) {
opts.headers = opts.headers || {};
opts.headers['Authorization'] = 'Bearer ' + localStorage.getItem('globe_token');
}
return _origFetch(url, opts).then(function(r) {
if (r.status === 401 || r.status === 403) { localStorage.removeItem('globe_token'); window.location.href = '/login'; }
return r;
});
};
</script>
<!-- Header -->
<header id="header">
<div class="header-brand">
@@ -30,13 +47,13 @@
<h3 class="panel-title">LAYER</h3>
<div class="panel-section">
<label class="layer-toggle">
<input type="checkbox" id="layer-flights">
<input type="checkbox" id="layer-flights" checked>
<span class="layer-dot dot-flights"></span>
<span class="layer-name">Flugverkehr</span>
<span class="layer-count" id="count-flights">-</span>
</label>
<label class="layer-toggle">
<input type="checkbox" id="layer-ships">
<input type="checkbox" id="layer-ships" checked>
<span class="layer-dot dot-ships"></span>
<span class="layer-name">Schiffsverkehr</span>
<span class="layer-count" id="count-ships">-</span>
@@ -57,7 +74,7 @@
<div class="panel-divider"></div>
<div class="panel-section">
<label class="layer-toggle">
<input type="checkbox" id="layer-daynight">
<input type="checkbox" id="layer-daynight" checked>
<span class="layer-dot dot-daynight"></span>
<span class="layer-name">Tag/Nacht</span>
</label>