{ }
GET
REST API · OpenAPI · Security · OAuth2
OpenAPI Security Schemes praktisch verstehen
apiKey, Bearer, OAuth2 und OpenID Connect

Eine REST-API ohne korrekt dokumentierte Sicherheitsanforderungen ist für Konsumenten eine Blackbox. OpenAPI 3.x bietet vier Security-Scheme-Typen, die sich in der Swagger-UI direkt nutzbar machen lassen – wenn man weiß, wie man sie korrekt modelliert, global und endpoint-spezifisch kombiniert und mit Scopes granular steuert.

15 Min. Lesezeit apiKey · Bearer · OAuth2 · OIDC · Scopes OpenAPI 3.0 · 3.1 · Swagger UI

1. Warum Security Schemes in der API-Dokumentation entscheidend sind

OpenAPI-Dokumente ohne korrekte Security-Definitionen sind aus Konsumentensicht unvollständig. Wenn ein Frontend-Entwickler in der Swagger-UI sieht, dass ein Endpoint einen 401-Status zurückgeben kann, aber kein Security Scheme hinterlegt ist, muss er im Quellcode oder in der Projektdokumentation nachschlagen, welche Authentifizierungsmethode der Endpoint erwartet. Das kostet Zeit und führt zu Fehlern bei der Integration.

Die OpenAPI Specification definiert Security Schemes als Teil der components-Sektion und erlaubt es, diese Schemes global für alle Operationen oder individuell pro Endpoint zu referenzieren. Das Ergebnis: Die Swagger-UI zeigt einen "Authorize"-Button, über den Nutzer ihre Credentials eintragen können, und Testtools wie Postman importieren die Authentifizierungskonfiguration direkt aus dem OpenAPI-Dokument. Eine korrekte Security-Scheme-Modellierung macht den Unterschied zwischen einer Dokumentation, die tatsächlich verwendbar ist, und einer, die nur als Referenz existiert.

Besonders relevant wird das Thema, wenn mehrere Authentifizierungsmethoden parallel existieren: eine interne API für Microservices nutzt möglicherweise API-Keys, während die public-facing API OAuth2 verlangt. OpenAPI erlaubt es, beide Schemes zu definieren und sie an unterschiedlichen Endpoints zu referenzieren – ohne redundante Beschreibung und mit klarer Semantik für Tooling und Audits.

2. Die vier Security-Scheme-Typen im Überblick

OpenAPI 3.x definiert vier Security-Scheme-Typen: apiKey, http, oauth2 und openIdConnect. Jeder Typ hat einen anderen Mechanismus, unterschiedliche semantische Bedeutung und unterschiedliche Swagger-UI-Darstellung. Die Wahl des richtigen Typs ist keine Stilfrage – sie bestimmt, wie Tooling mit dem Scheme umgeht, welche Felder pflichtend sind und wie Codegeneratoren den Authentifizierungscode erzeugen.

Ein häufiger Fehler ist der Einsatz von apiKey für Bearer-Token, obwohl der Typ http mit scheme: bearer die semantisch korrekte Wahl wäre. Beide senden einen Wert im Authorization-Header, aber Tooling behandelt sie unterschiedlich: Für http bearer fügen Clients das "Bearer "-Präfix automatisch hinzu, für apiKey nicht. Diese subtilen Unterschiede haben direkte Auswirkungen auf generierte Client-Bibliotheken und Test-Konfigurationen.


# components/securitySchemes — all four types defined
components:
  securitySchemes:

    # Type 1: apiKey — sends value in header, query or cookie
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: >
        Internal service-to-service key. Include the raw key value.
        Do NOT add a "Bearer " prefix — the server expects the key directly.

    # Type 2: http — standard HTTP auth schemes (basic, bearer, digest)
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >
        JWT issued by the authorization server. Include in the
        Authorization header. The "Bearer " prefix is added automatically
        by conforming clients.

    # Type 3: oauth2 — full OAuth2 flow support
    OAuth2:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://auth.mironsoft.de/oauth/authorize
          tokenUrl: https://auth.mironsoft.de/oauth/token
          refreshUrl: https://auth.mironsoft.de/oauth/token
          scopes:
            read:orders: Read order data
            write:orders: Create and update orders
            admin:users: Manage user accounts (requires admin role)

    # Type 4: openIdConnect — discovery document URL
    OpenIDConnect:
      type: openIdConnect
      openIdConnectUrl: https://auth.mironsoft.de/.well-known/openid-configuration

3. apiKey: einfach, aber mit Fallstricken

Der apiKey-Typ ist der einfachste Security-Scheme-Typ und eignet sich für APIs, die einen statischen Schlüssel zur Authentifizierung erwarten – typischerweise interne APIs, Webhook-Empfänger oder Partner-APIs mit begrenztem Scope. Der Schlüssel kann im Request-Header (in: header), im Query-Parameter (in: query) oder in einem Cookie (in: cookie) übertragen werden.

Der häufigste Fallstrick: API-Keys im Query-Parameter erscheinen in Server-Logs, Proxy-Protokollen und Browser-Historien. Das ist ein Sicherheitsrisiko, das in der Dokumentation explizit adressiert werden sollte. OpenAPI bietet keine eigene Möglichkeit, auf Security-Risiken hinzuweisen – das gehört in das description-Feld des Schemes. Wer API-Keys mit Ablaufdatum und Rotation modelliert, sollte das ebenfalls dokumentieren, da OpenAPI nur den Mechanismus, nicht die Lebensdauer beschreibt.

Ein weiterer praktischer Punkt: Wenn eine API zwei parallele apiKey-Schemes kennt – etwa einen Key für Lese- und einen für Schreiboperationen – lassen sich beide in components/securitySchemes definieren und an Endpoints einzeln referenzieren. Das zeigt Konsumenten sofort, welche Endpoints welchen Key erfordern, ohne dass diese Information in der Beschreibung versteckt ist.

4. http Bearer: der Standard für moderne APIs

Der http-Typ mit scheme: bearer ist die korrekte OpenAPI-Modellierung für JWT-basierte Authentifizierung und andere Bearer-Token-Verfahren. Das optionale Feld bearerFormat hat keine funktionale Bedeutung für die Validierung – es ist ein Hinweis für Tooling und Dokumentationsleser. Typische Werte sind JWT, opaque oder SAML.

Ein wichtiges Detail für die Swagger-UI-Integration: Wenn ein Nutzer in der Swagger-UI einen Bearer-Token einträgt, fügt die UI das "Bearer "-Präfix automatisch hinzu. Das bedeutet, dass Nutzer nur den Token selbst eintragen sollten, nicht "Bearer " vorangestellt. Diese Information gehört in das description-Feld des Schemes, weil sie für Tester nicht intuitiv ist und zu häufigen 401-Fehlern beim manuellen Testen führt.


# Bearer Auth with detailed description for Swagger UI users
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: |
        **JWT Bearer Token Authentication**

        Obtain a token via POST /auth/token with your credentials.
        Enter ONLY the token — the "Bearer " prefix is added automatically.

        Token structure (claims):
        - sub: user ID
        - roles: array of role strings
        - exp: expiry as Unix timestamp (default: 3600s)

        Example token endpoint response:
        ```json
        {
          "access_token": "eyJhbGci...",
          "token_type": "Bearer",
          "expires_in": 3600
        }
        ```

paths:
  /orders:
    get:
      summary: List orders
      security:
        - BearerAuth: []      # bearer token required, no scopes for http scheme
      responses:
        '200':
          description: Order list
        '401':
          description: Missing or invalid token
        '403':
          description: Insufficient permissions

  /health:
    get:
      summary: Health check — public endpoint
      security: []            # override: no auth required for this endpoint
      responses:
        '200':
          description: Service is healthy

5. OAuth2 Flows vollständig modellieren

OpenAPI 3.x unterstützt alle vier OAuth2-Flows: authorizationCode, implicit, clientCredentials und password. In der Praxis dominieren heute authorizationCode (mit PKCE für Public Clients) und clientCredentials für Maschine-zu-Maschine-Kommunikation. Der implicit-Flow gilt als deprecated, der password-Flow als unsicher – beide sollten in neuen APIs nicht mehr modelliert werden, außer zur Dokumentation von Legacy-Verhalten.

Die Scope-Modellierung im OAuth2-Scheme ist der wichtigste Unterschied zu anderen Scheme-Typen: Scopes sind benannte Berechtigungen, die der Authorization Server dem Token ausstellt und die die API bei der Autorisierung prüft. OpenAPI erlaubt es, diese Scopes in der Security-Scheme-Definition zu benennen und pro Endpoint zu referenzieren. Das Tooling – Swagger-UI, Postman, generierte Clients – nutzt diese Information, um Nutzer bei der Token-Anfrage mit den richtigen Scopes zu unterstützen.


# OAuth2 with multiple flows for different client types
components:
  securitySchemes:
    OAuth2:
      type: oauth2
      flows:
        # Browser-based apps and mobile: use authorizationCode + PKCE
        authorizationCode:
          authorizationUrl: https://auth.mironsoft.de/oauth/authorize
          tokenUrl: https://auth.mironsoft.de/oauth/token
          refreshUrl: https://auth.mironsoft.de/oauth/token
          scopes:
            'read:products': View product catalog
            'write:products': Create and update products
            'read:orders': View own orders
            'write:orders': Place and cancel orders
            'admin:orders': Manage all orders (requires admin role)
            'admin:users': Manage user accounts (requires admin role)

        # Server-to-server: no user interaction, uses client credentials
        clientCredentials:
          tokenUrl: https://auth.mironsoft.de/oauth/token
          scopes:
            'service:read': Read-only service access
            'service:write': Read-write service access

paths:
  /products:
    post:
      summary: Create product
      security:
        - OAuth2:
          - write:products    # minimum required scope
      responses:
        '201':
          description: Product created
        '403':
          description: Scope write:products not present in token

  /admin/orders:
    get:
      summary: List all orders (admin)
      security:
        - OAuth2:
          - admin:orders      # admin scope required
        - BearerAuth: []      # OR: internal service with Bearer token
      responses:
        '200':
          description: All orders

6. OpenID Connect: Federation und Discovery

Der openIdConnect-Typ ist der am wenigsten genutzte und gleichzeitig der mächtigste Security-Scheme-Typ in OpenAPI. Er referenziert eine OpenID Connect Discovery URL (/.well-known/openid-configuration), aus der Tooling und Clients alle Endpoint-URLs, unterstützten Flows und Scopes automatisch ableiten können. Das spart Pflegeaufwand: Wenn der Authorization Server seine Endpoints ändert, muss nur das Discovery-Dokument aktualisiert werden – nicht das OpenAPI-Schema.

Ein praktischer Punkt für Swagger-UI: Die UI unterstützt openIdConnect ab Version 4.x und kann aus der Discovery-URL automatisch den Authorization-Endpoint für den authorizationCode-Flow ableiten. Für ältere Swagger-UI-Versionen ist ein paralleles OAuth2-Scheme empfehlenswert, das die Endpoints explizit ausschreibt. Beide Schemes können gleichzeitig in components/securitySchemes definiert sein – eines für Tooling-Kompatibilität, eines für semantische Korrektheit.

7. Scopes granular und konsistent definieren

Scope-Naming ist eine der häufigsten Inkonsistenzquellen in API-Designs. Wenn ein Team read_orders verwendet und ein anderes orders:read, entstehen Konfusionen bei Konsumenten und Probleme bei der Scope-Validierung im Authorization Server. Die Empfehlung: Eine Namenskonvention festlegen und in allen Schemes konsequent durchhalten. Üblich sind resource:action (z. B. orders:read), action:resource (z. B. read:orders) und hierarchische Scopes wie api.orders.read.

Ein wichtiges Konzept: Scopes in OpenAPI beschreiben die minimalen Berechtigungen, die ein Token haben muss, damit ein Endpoint die Anfrage verarbeitet. Sie sind keine Garantie dafür, dass die API keine weiteren Prüfungen durchführt – eine Business-Logic-Prüfung (z. B. "Darf dieser Nutzer diese spezifische Bestellung sehen?") ist keine Scope-Prüfung. Diese Unterscheidung sollte in der API-Dokumentation klar gemacht werden, damit Konsumenten keine falschen Erwartungen an den Scope-Mechanismus haben.

8. Globale vs. endpoint-spezifische Security

OpenAPI erlaubt es, ein Security-Scheme auf Root-Ebene des Dokuments zu definieren – das gilt dann für alle Operationen als Default. Endpoints, die eine andere Konfiguration benötigen (z. B. Public-Endpoints ohne Auth oder Endpoints mit höheren Berechtigungen), überschreiben das globale Security-Objekt mit einem eigenen. Ein leeres Array (security: []) deaktiviert die Authentifizierung explizit für diesen Endpoint.

Dieses Muster ist besonders nützlich für APIs, bei denen die überwiegende Mehrheit der Endpoints dieselbe Authentifizierung erwartet: Das globale Security-Scheme setzt den Default, und nur Ausnahmen werden explizit dokumentiert. Das reduziert Redundanz im YAML und macht deutlich, welche Endpoints bewusst ohne Authentifizierung zugänglich sind – eine Information, die für Security Audits und API-Reviews wichtig ist.

Security-Scheme-Typ Typischer Anwendungsfall Swagger-UI-Support Scope-Support
apiKey Interne APIs, Partner-Keys, Webhooks Vollständig Nein
http bearer JWT-basierte APIs, moderne REST APIs Vollständig Nein (im Scheme)
oauth2 Public APIs, Drittanbieter-Integration Vollständig Ja
openIdConnect Federation, SSO, Discovery-basiert Ab v4.x Ja (via Discovery)

9. Globale und endpoint-spezifische Konfiguration

In der Praxis kombinieren produktive APIs häufig mehrere Security-Scheme-Typen. Eine typische Konfiguration: Globales Bearer-Scheme für alle authentifizierten Endpoints, OAuth2 mit Scopes für Drittanbieter-Zugriff, und ein apiKey-Scheme für Monitoring- und Health-Endpoints, die von internen Tools aufgerufen werden. Diese Kombination lässt sich in OpenAPI sauber modellieren, ohne dass Endpoints doppelt dokumentiert werden müssen.


# Global security + per-endpoint overrides
openapi: 3.1.0
info:
  title: Mironsoft Shop API
  version: 2.0.0

# Global default: all endpoints require Bearer auth
security:
  - BearerAuth: []

components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key

    OAuth2:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://auth.mironsoft.de/oauth/token
          scopes:
            'api:read': Read access
            'api:write': Write access

paths:
  /orders:
    get:
      summary: List orders — uses global Bearer auth
      # No security key needed — inherits global BearerAuth: []
      responses:
        '200':
          description: OK

  /health:
    get:
      summary: Health check — public, no auth
      security: []            # explicitly disable all auth
      responses:
        '200':
          description: OK

  /metrics:
    get:
      summary: Prometheus metrics — internal key only
      security:
        - ApiKeyAuth: []      # override global: internal key instead of Bearer
      responses:
        '200':
          description: Metrics in text/plain

  /integrations/orders:
    get:
      summary: Order feed for partners — OAuth2 or Bearer
      security:
        - OAuth2:
          - api:read          # partner OAuth2 with scope
        - BearerAuth: []      # OR: internal Bearer token
      responses:
        '200':
          description: Order feed

10. Zusammenfassung

OpenAPI Security Schemes sind keine optionale Dokumentationserweiterung – sie sind das Fundament für nutzbare API-Dokumentation, funktionierendes Tooling und effiziente Security Audits. Der richtige Scheme-Typ macht den Unterschied: apiKey für statische Keys, http bearer für JWT, oauth2 wenn Scopes und Flows relevant sind, openIdConnect für Federation-Szenarien. Scopes konsequent und konsistent benennen, globale Security-Defaults setzen und Ausnahmen explizit mit security: [] dokumentieren.

Die Swagger-UI macht Security Schemes sofort nutzbar: Nutzer können Credentials eintragen und Endpoints direkt testen. Postman und andere Tools importieren die Konfiguration automatisch. Codegeneratoren wie openapi-generator erzeugen Authentifizierungscode, der dem Security-Scheme-Typ entspricht. Die Investition in sorgfältige Security-Scheme-Modellierung zahlt sich in weniger Supportaufwand, schnellerer Integration und besserer Auditierbarkeit aus.

OpenAPI Security Schemes — Das Wichtigste auf einen Blick

Scheme-Typen

apiKey für statische Keys, http bearer für JWT, oauth2 für Flows mit Scopes, openIdConnect für Discovery-basierte Federation.

Globale Security

Root-Level security setzt Default für alle Endpoints. Überschreiben pro Endpoint möglich. security: [] macht Endpoint explizit public.

Scopes

Nur OAuth2 und OIDC unterstützen Scopes nativ. Namenskonvention festlegen (resource:action) und konsequent durchhalten. Scopes beschreiben Mindest-Berechtigungen, keine Business-Logic.

Swagger-UI

Alle Scheme-Typen außer OIDC werden vollständig unterstützt. Bearer-Eingabe: nur Token, kein "Bearer "-Präfix. Hinweis im description-Feld dokumentieren.

11. FAQ: OpenAPI Security Schemes

1Unterschied apiKey vs. http bearer?
http bearer ist semantisch korrekt für JWTs und fügt das "Bearer "-Präfix automatisch hinzu. apiKey sendet den rohen Wert und kann in Header, Query oder Cookie platziert werden.
2Endpoint ohne Authentifizierung?
security: [] auf Endpoint-Ebene überschreibt das globale Security-Schema und macht den Endpoint explizit public — sichtbar für Security-Audits.
3AND vs. OR bei mehreren Schemes?
Mehrere Einträge im Array sind OR-verknüpft. Mehrere Schemes im selben Eintrag sind AND-verknüpft. Ein Request muss mindestens einen Array-Eintrag vollständig erfüllen.
4Was bedeutet bearerFormat?
Informativer Hinweis ohne Validierungsfunktion. Teilt Tooling mit, welches Token-Format erwartet wird. Typische Werte: JWT, opaque, SAML.
5OAuth2-Flow für Browser-Apps?
authorizationCode mit PKCE. implicit ist deprecated. PKCE schützt Browser-Apps vor Authorization-Code-Interception-Angriffen.
6Vorteil openIdConnect vs. oauth2?
Discovery-URL — Tooling leitet alle Endpoints automatisch ab. Änderungen am Authorization Server erfordern keine Anpassung des OpenAPI-Schemas.
7Scope-Namenskonvention?
resource:action, action:resource oder hierarchisch. Wichtig ist die konsequente Durchhaltung einer Konvention über alle Endpoints und Teams hinweg.
8Zeigt Swagger-UI Security Schemes automatisch?
Ja. Alle Schemes erscheinen im Authorize-Dialog. Bearer-Tokens werden automatisch mit dem "Bearer "-Präfix gesendet. Hinweis im description-Feld empfehlenswert.
9Mehrere OAuth2-Flows im selben Scheme?
Ja. Das flows-Objekt kann authorizationCode, clientCredentials, implicit und password gleichzeitig enthalten. Tooling zeigt alle Flows zur Auswahl an.
10API-Key-Ablauf dokumentieren?
Im description-Feld des Security Schemes. OpenAPI hat kein eigenes Konzept für Key-Lebensdauer — Ablaufzeit, Rotationsintervall und Erneuerungsprozess dort beschreiben.