-- API-Tokens mit granularem Scope (ro/rw je Ressourcengruppe) fuer -- programmatischen Zugriff auf die Admin-/Verwaltungs-API, unabhaengig von -- der Browser-Session. Bewusst NICHT nutzbar fuer SSH/RDP/SFTP-Sitzungen -- selbst (Terminal-/RDP-WebSocket und Dateitransfer bleiben ausschliesslich -- an eine eingeloggte, TOTP-verifizierte Session gebunden -- siehe -- app/auth/deps.py) und NICHT nutzbar, um weitere Tokens zu verwalten -- (Privilege-Escalation-Schutz: Token-Verwaltung selbst bleibt reine -- Session-Admin-Aktion). -- -- Nur der Hash des Tokens wird gespeichert (siehe app/security/api_tokens.py, -- analog zu Recovery-Codes); das Klartext-Token wird nur einmalig bei der -- Erzeugung angezeigt und ist danach nicht mehr rekonstruierbar. CREATE TABLE IF NOT EXISTS api_tokens ( id INTEGER PRIMARY KEY, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, label TEXT NOT NULL, token_hash TEXT NOT NULL UNIQUE, token_prefix TEXT NOT NULL, scopes_json TEXT NOT NULL, created_by INTEGER REFERENCES users(id), created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')), expires_at TEXT, last_used_at TEXT, revoked_at TEXT ); CREATE INDEX IF NOT EXISTS idx_api_tokens_user ON api_tokens(user_id);