Auth: Nur noch Magic Link, Code-Verifizierung entfernt

- /api/auth/verify-code Endpoint entfernt
- generate_magic_code() entfernt
- E-Mail: Nur noch Anmelde-Link, kein 6-stelliger Code
- Login-Seite: Zeigt nach E-Mail-Eingabe Hinweis statt Code-Feld
- Magic Link Token-Verifikation via URL bleibt bestehen
Dieser Commit ist enthalten in:
Claude Dev
2026-03-25 00:01:21 +01:00
Ursprung bd2c274dd2
Commit af08fa6b4d
5 geänderte Dateien mit 69 neuen und 183 gelöschten Zeilen

110
CLAUDE.md
Datei anzeigen

@@ -29,7 +29,7 @@ Inspiriert vom WorldView/God's Eye Konzept, komplett eigenentwickelt.
| Layer | Quelle | API | Refresh | Menge |
|-------|--------|-----|---------|-------|
| Flugverkehr | adsb.lol | /v2/point/30/0/10000 | 15s | ~10.800 |
| (Fallback) | adsb.one | /v2/point/30/0/10000 | - | ~7.000 |
| | adsb.one (Fallback) | /v2/point/30/0/10000 | - | ~7.000 |
| Schiffsverkehr | AISStream.io | WebSocket wss://stream.aisstream.io | Echtzeit | ~15.000+ |
| Erdbeben | USGS | earthquake.usgs.gov GeoJSON | 5min | ~50/Tag |
| Katastrophen | NASA EONET | eonet.gsfc.nasa.gov/api/v3 | 10min | ~30-80 aktiv |
@@ -51,67 +51,26 @@ Inspiriert vom WorldView/God's Eye Konzept, komplett eigenentwickelt.
## API-Keys & Credentials
Alle in ~/AegisSight-Globe/.env (nicht in Git):
- AISSTREAM_KEY: AISStream.io WebSocket API
- CESIUM_ION_TOKEN: Cesium Ion (Free-Tier, Commercial noetig fuer Vertrieb)
- JWT_SECRET: Gleicher wie Monitor
- SMTP_*: E-Mail-Versand fuer Magic Link
- MONITOR_API_KEY: Public API Key des Monitors
- DISASTER_INCIDENT_ID=45: Naturkatastrophen-Lage fuer Auto-Push
- AISSTREAM_KEY AISStream.io WebSocket API
- CESIUM_ION_TOKEN Cesium Ion (Free-Tier, Commercial noetig fuer Vertrieb)
- JWT_SECRET Gleicher wie Monitor
- SMTP_* E-Mail-Versand fuer Magic Link
- MONITOR_API_KEY Public API Key des Monitors
- DISASTER_INCIDENT_ID=45 Naturkatastrophen-Lage fuer Auto-Push
## Verzeichnisstruktur
```
~/AegisSight-Globe/
├── .env
├── .gitignore
├── CLAUDE.md
├── requirements.txt
├── src/
│ ├── main.py # FastAPI App, Auth-Middleware, Static Mount
│ ├── config.py # DB, JWT, SMTP Konfiguration
│ ├── database.py # aiosqlite Verbindung zur geteilten DB
│ ├── auth.py # JWT + Magic Link Token/Code
│ ├── auth_router.py # /api/auth/* Endpoints
│ ├── email_utils.py # Magic Link E-Mail-Versand
│ ├── data_flights.py # adsb.lol + adsb.one Fallback
│ ├── data_ships.py # AISStream.io WebSocket Collector
│ ├── data_quakes.py # USGS Earthquake API
│ ├── data_gdelt.py # GDELT GEO 2.0 API
│ ├── data_satellites.py # CelesTrak TLE Orbital Elements
│ ├── data_disasters.py # NASA EONET Events
│ ├── data_monitor.py # Proxy zum Monitor Public API
│ └── data_push.py # Auto-Push: Globe-Events -> Monitor
├── static/
│ ├── index.html # CesiumJS Globe
│ ├── login.html # Magic Link Login
│ ├── css/globe.css # Dark-Theme
│ └── js/
│ ├── app.js # Viewer, Layer-Management
│ ├── layers/
│ │ ├── flights.js # Flugverkehr (zoom-adaptiv)
│ │ ├── ships.js # Schiffsverkehr (zoom-adaptiv)
│ │ ├── disasters.js # EONET + USGS kombiniert
│ │ ├── gdelt.js # GDELT Nachrichten
│ │ ├── satellites.js # Satelliten-Orbits
│ │ ├── weather.js # Regenradar
│ │ ├── monitor.js # Monitor OSINT-Daten
│ │ └── visualmodes.js # NVG, FLIR, CRT
│ └── ui/
│ ├── sidebar.js # Rechte Datenpunkt-Sidebar
│ ├── search.js # Ortssuche + City Quick-Links
│ ├── imagery.js # Satellitenbilder-Switcher
│ └── crosshairs.js # Fadenkreuz + Range Rings
└── logs/globe.log
```
## Bidirektionale Monitor-Verbindung
### Globe -> Monitor (Auto-Push, data_push.py)
- Alle 10min: NASA EONET + USGS M4.5+ als Artikel an Monitor-Lage 45
- Duplikat-Check per Headline, Locations mit Koordinaten
### Globe -> Monitor (Auto-Push)
- data_push.py sendet alle 10min NASA EONET + USGS M4.5+ an Monitor
- Ziel-Lage: ID 45 (Naturkatastrophen international)
- Duplikat-Check per Headline im Monitor
- Monitor verifiziert und erstellt Zusammenfassung
### Monitor -> Globe (Feed, data_monitor.py)
### Monitor -> Globe (Feed)
- /api/public/globe-feed?incident_id=X liefert GeoJSON
- Pro Standort: Ortsspezifische Artikel (Headline, Quelle, Auszug, Datum)
- Lage-Auswahl im Globe-Header bestimmt welche Daten angezeigt werden
@@ -119,24 +78,27 @@ Alle in ~/AegisSight-Globe/.env (nicht in Git):
### Klick-Flow
1. User waehlt Lage im Header (z.B. Naturkatastrophen)
2. Monitor-Standorte erscheinen als rote Punkte
3. Klick auf Katastrophe zeigt NASA-Daten + passende Monitor-Artikel
4. Zuordnung ist ortsspezifisch (Kenia-Klick = Kenia-Artikel)
2. Monitor-Standorte erscheinen als rote Punkte auf dem Globus
3. Klick auf Katastrophe zeigt: NASA-Daten + passende Monitor-Artikel
4. Artikel sind ortsspezifisch (Kenia-Klick = Kenia-Artikel, nicht global)
## Auth-System
- Magic Link: E-Mail -> 6-stelliger Code -> JWT (24h)
- Magic Link Login: E-Mail -> 6-stelliger Code per Mail -> JWT
- Prueft: users.is_active=1 UND users.globe_access=1
- Globe-Zugang: An/Aus-Button im Verwaltungsportal pro User
- Globe-Zugang wird im Verwaltungsportal per An/Aus-Button gesteuert
- JWT-Tokens: 24h Gueltigkeit, akzeptiert auch Monitor-Tokens
- Alle Daten-APIs hinter Auth-Middleware
- Akzeptiert auch Monitor-JWT-Tokens (Kompatibilitaet)
## Rendering-Architektur
### Performance (PointPrimitiveCollection, GPU-beschleunigt)
- Weit (>5.000km): 5-Grad-Raster-Cluster mit Count-Labels
### Performance
- Flugzeuge/Schiffe: PointPrimitiveCollection (GPU-beschleunigt)
- Zoom-adaptiv: Cluster bei Uebersicht, Einzelpunkte bei Detail
- Weit (>5.000km): 5-Grad-Raster mit Count-Labels
- Mittel (1.000-5.000km): 2-Grad-Raster
- Nah (<1.000km): Einzelne Punkte, Details bei Klick
- Nah (<1.000km): Einzelne Punkte
- Katastrophen/Satelliten: Entity API (kleinere Mengen)
### Visual Modes
- STD: Photorealistisch
@@ -146,23 +108,19 @@ Alle in ~/AegisSight-Globe/.env (nicht in Git):
## Bekannte Limitierungen
- Cesium Ion Free-Tier: Nicht fuer kommerziellen Vertrieb
- Cesium Ion Free-Tier: Nicht fuer kommerziellen Vertrieb (Commercial License noetig)
- Satelliten-Positionen: Vereinfachte Kepler-Berechnung (nicht SGP4-exakt)
- AISStream: ~1-2min bis globale Abdeckung nach Restart
- Sentinel-2: Wolkenfreie Komposite, nicht tagesaktuell
- AISStream: Schiffsdaten brauchen ~1-2min bis globale Abdeckung nach Restart
- OpenSky als Flug-Fallback: Aggressive Rate-Limits (429), daher adsb.lol als Primary
## Services neustarten
## Services
```bash
sudo systemctl restart globe # Globe-App
sudo systemctl restart osint-monitor # Monitor (API-Aenderungen)
sudo systemctl restart verwaltungsportal # Verwaltung
```
## Entwicklungshinweise
- Alle JS als statische Dateien (kein Build-Step)
- Cache-Busting: Ctrl+Shift+R im Browser
- JS-Syntax pruefen: node --check static/js/layers/DATEI.js
- Inkrementelle Patches vermeiden — Dateien komplett neu schreiben
- Alle JS-Dateien werden als statische Dateien ausgeliefert (kein Build-Step)
- Cache-Busting: Browser-Cache manuell mit Ctrl+Shift+R leeren
- JS-Syntax pruefen: node --check ~/AegisSight-Globe/static/js/layers/DATEI.js
- Inkrementelle Patches vermeiden — bei groesseren Aenderungen Datei komplett neu schreiben
- .env Aenderungen erfordern Service-Restart