API-Keys¶
API-Keys sind die primäre Authentifizierungsmethode für den MoE-Orchestrator. Jeder User kann mehrere Keys erstellen, z.B. einen pro Gerät oder Anwendung.
Key-Format¶
Beispiel: moe-sk-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6
Sicherheit
Der vollständige Key wird nur einmalig nach der Erstellung angezeigt. Danach ist nur noch der Prefix sichtbar. Der Key wird niemals im Klartext gespeichert — nur ein SHA-256-Hash.
Keys verwalten (/user/keys)¶
Meine API-Keys – Tabelle¶
| Spalte | Beschreibung |
|---|---|
| Key-Prefix | Erste 16 Zeichen + ... |
| Label | Benutzerdefinierter Name |
| Erstellt | Erstellungsdatum |
| Zuletzt genutzt | Letzter Nutzungszeitpunkt (nie wenn noch ungenutzt) |
| Status | Aktiv (grün) oder Gesperrt (rot) |
| ✎ | Label bearbeiten |
| 🔒 | Key sperren |
Neuen Key erstellen¶
- Bezeichnung eingeben (optional, max. 100 Zeichen, z.B. „Claude Code Laptop")
- Key erstellen klicken →
POST /user/keys - Vollständigen Key einmalig anzeigen — in die Zwischenablage kopieren!
- Der Key erscheint ab sofort in der Tabelle mit dem Prefix
Key-Label bearbeiten¶
- ✎-Symbol klicken → Modal öffnet sich
- Neues Label eingeben
- Speichern →
PATCH /user/keys/{key_id}/label
Key sperren¶
- 🔒-Symbol klicken → Bestätigung
POST /user/keys/{key_id}/revoke- Key ist sofort ungültig; Redis-Cache wird invalidiert
Empfehlung
Einen Key pro Gerät/Anwendung erstellen. So kann ein kompromittierter Key gezielt gesperrt werden ohne andere Integrationen zu unterbrechen.
API-Key in Anwendungen verwenden¶
Der MoE-Orchestrator akzeptiert zwei Header-Formate:
Technischer Hintergrund¶
Validierungs-Flow¶
API-Request mit Header "Authorization: Bearer moe-sk-..."
│
SHA-256-Hash des Keys berechnen
│
Redis-Lookup: user:apikey:{hash} → TTL 5 Minuten
│ Cache Hit │ Cache Miss
│ SQLite-Lookup
│ → Redis-Cache befüllen
│
User-Objekt abrufen (is_active, role, limits, permissions)
│
Budget prüfen → 429 wenn überschritten
│
Request verarbeiten
Redis-Schema¶
user:apikey:{sha256} → HASH {
user_id: "...",
username: "...",
role: "user|expert|admin",
is_active: "1",
daily_limit: "100000",
monthly_limit: "1000000",
total_limit: "",
permissions: "{...JSON...}"
}
TTL: 300 Sekunden (5 Minuten)
Nach einer Sperrung oder Permissions-Änderung wird der Cache sofort invalidiert → nächste Anfrage wird direkt abgewiesen bzw. mit aktuellen Rechten ausgeführt.
Datenbankschema¶
CREATE TABLE api_keys (
id TEXT PRIMARY KEY, -- UUID4
user_id TEXT NOT NULL REFERENCES users(id),
key_hash TEXT UNIQUE NOT NULL, -- SHA-256
key_prefix TEXT NOT NULL, -- Erste 16 Zeichen
label TEXT,
is_active INTEGER DEFAULT 1,
created_at TEXT NOT NULL,
last_used_at TEXT, -- NULL = noch nie genutzt
expires_at TEXT -- NULL = kein Ablauf
);
CREATE INDEX idx_keys_hash ON api_keys(key_hash);
CREATE INDEX idx_keys_user ON api_keys(user_id);