Zum Inhalt springen
Prototyp pruefen

Authentifizierung und Autorisierung

Die Superheld API dokumentiert zwei Authentifizierungsmechanismen: API-Schluessel fuer direkte Integrationen und OAuth2 fuer delegierten Zugriff durch Drittanwendungen. Die aktuelle Workspace-Runtime nutzt im Secure Mux einen einfachen Bearer-Token-Store; produktive Key-Lifecycle-Details bleiben noch im Abgleich.

Current workspace note: Zusätzlich existiert jetzt ein interner, tenant-gebundener Secure-Mux-Prototyp für Token-Lifecycle über GET /tokens, POST /tokens, GET /tokens/audit, GET /tokens/{id}, GET /tokens/{id}/audit und DELETE /tokens/{id}. Er ist als Runtime-Operatorpfad nutzbar, aber noch kein finaler öffentlicher Produktvertrag. In cmd/server werden dabei nur SHA-256(token) plus Metadaten persistiert; der rohe Tokenwert wird nur einmal bei der Erstellung zurückgegeben. Audit-Einträge zu Tokens folgen demselben Runtime-Backend.

Der produktive API-Key-Lifecycle ist noch nicht final mit der Workspace-Implementierung abgeglichen. In öffentlichen Beispielen werden folgende Präfixe verwendet:

PräfixUmgebung
sh_live_Produktionsumgebung
sh_test_Testumgebung

Beispiel:

sh_live_abc123xyz456

API-Schlüssel werden im Superheld-Dashboard unter Einstellungen → API-Zugang → Neuer Schlüssel erstellt. Bei der Erstellung wählen Sie einen Namen, die gewünschten Scopes und optional ein Ablaufdatum. Der Schlüssel wird nur einmal vollständig angezeigt — speichern Sie ihn sofort in einem Credential-Manager.

API-Schlüssel können in der aktuellen Workspace-Runtime entweder im Authorization-Header oder im X-API-Key-Header übergeben werden:

Terminal-Fenster
curl -X GET https://api.superheld.app/devices \
-H "Authorization: Bearer sh_live_abc123xyz456"
Terminal-Fenster
curl -X GET https://api.superheld.app/devices \
-H "X-API-Key: sh_live_abc123xyz456"

Schlüssel dürfen nicht im Query-String oder Request-Body übermittelt werden. Alle Anfragen müssen über HTTPS erfolgen.

Empfohlene Vorgehensweise zur Schlüsselrotation:

  1. Neuen Schlüssel mit identischen Scopes im Dashboard erstellen.
  2. Integration aktualisieren — neuen Schlüssel in der Anwendung hinterlegen.
  3. Alten Schlüssel widerrufen, sobald die Integration mit dem neuen Schlüssel arbeitet.

Empfohlener Rotationszyklus: alle 90 Tage. In sicherheitskritischen Umgebungen: 30 Tage.

Kompromittierte Schlüssel können unter Einstellungen → API-Zugang sofort widerrufen werden. Der Widerruf ist unwiderruflich und wirkt sofort — alle Anfragen mit diesem Schlüssel erhalten ab diesem Zeitpunkt 401 Unauthorized.

Current workspace note: Die öffentliche OAuth2-Darstellung beschreibt den Zielvertrag. Die aktuelle Workspace-Runtime belegt dafür noch keinen vollständigen produktiven Endpunktpfad.

Für Szenarien, in denen Drittanwendungen im Namen eines Benutzers auf die API zugreifen.

Für Webanwendungen, bei denen ein Benutzer den Zugriff explizit autorisiert:

Terminal-Fenster
# 1. Benutzer zur Autorisierung weiterleiten
https://auth.superheld.app/authorize?
response_type=code&
client_id=CLIENT_ID&
redirect_uri=https://meine-app.de/callback&
scope=devices:read threats:read
# 2. Authorization Code gegen Token tauschen
curl -X POST https://auth.superheld.app/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code&code=AUTH_CODE&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&redirect_uri=https://meine-app.de/callback"

Die Antwort enthält ein access_token und ein refresh_token. Das Access-Token ist 60 Minuten gültig.

Product target note: Refresh-Token-Lifecycle und Rotationsdetails werden erst dann als verbindlicher öffentlicher Vertrag dokumentiert, wenn sie mit der produktiven Auth-Implementierung abgestimmt sind.

Für Server-zu-Server-Integrationen ohne Benutzerinteraktion:

Terminal-Fenster
curl -X POST https://auth.superheld.app/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&scope=threats:read scan:write"
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "threats:read scan:write"
}

OAuth2-Token werden wie API-Schlüssel im Authorization-Header übergeben:

Terminal-Fenster
curl -X GET https://api.superheld.app/threats \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."

Scopes begrenzen den Zugriff eines Schlüssels oder Tokens auf bestimmte Ressourcen und Aktionen. Die folgende Tabelle enthält alle Scopes, die für die kanonischen Endpunkte (siehe API-Übersicht) erforderlich sind.

ScopeBerechtigungStatus
devices:readGeräte auflisten und Details abrufenImplemented
devices:writeGeräte registrieren und konfigurierenImplemented
threats:readBedrohungen auflisten und Details abrufenImplemented
alerts:readAbgeleitete Alerts abrufenImplemented
alerts:writeReserviert, aktuell keine Alert-Create-RouteReserved
incidents:readTenant-gebundene Security-Incidents abrufenImplemented (prototypisch/intern)
incidents:writeTenant-gebundene Security-Incidents weiter in ihrem Lifecycle bewegenImplemented (prototypisch/intern)
scan:writeInhalte zur Analyse übergebenImplemented
status:readSchutzstatus abrufenImplemented
events:readEreignisse abrufen (SIEM-Integration)Implemented
events:writeEreignisse über den Secure Mux einliefernImplemented
jobs:readAsynchrone Job-, Trace-, Step- und Artefakt-Records abrufenImplemented (prototypisch)
jobs:writeAsynchrone Job-Records anlegen und abbrechenImplemented (prototypisch)
jobs:reviewWaiting-Review-Jobs reviewen; jobs:write bleibt dafür als Legacy-Fallback akzeptiertImplemented (prototypisch)
tokens:readTenant-gebundene Secure-Mux-Token-Metadaten und Token-Audit abrufenImplemented (prototypisch/intern)
tokens:writeTenant-gebundene Secure-Mux-Tokens erzeugen und widerrufenImplemented (prototypisch/intern)
webhooks:readWebhooks und DLQ-Einträge abrufenImplemented
webhooks:writeWebhooks erstellen und DLQ-Replays auslösenImplemented

Anfragen, deren Scope nicht ausreicht, werden mit 403 Forbidden beantwortet:

{
"error": {
"code": "insufficient_scope",
"message": "Der Scope 'threats:read' ist für diesen Endpunkt erforderlich.",
"status": 403
}
}

Vergeben Sie immer nur die minimal notwendigen Scopes. Eine Integration, die ausschließlich Bedrohungen überwacht, benötigt lediglich threats:read.