Zum Hauptinhalt springen
Version: 0.2.0-beta.1

Bearer-Authentifizierung im MCP-Server konfigurieren

Mit der neuesten MCP-Spezifikation agiert dein MCP-Server als Ressourcenserver, der Zugangstokens für geschützte Ressourcen validiert. MCP Auth bietet verschiedene Möglichkeiten, die Bearer-Autorisierung zu konfigurieren:

  • JWT (JSON Web Token)-Modus: Eine integrierte Autorisierungsmethode, die JWTs mit Anspruchsüberprüfungen validiert.
  • Benutzerdefinierter Modus: Ermöglicht es dir, deine eigene Autorisierungslogik zu implementieren.

Das Bearer-Auth-Middleware erfordert nun die Angabe, zu welcher Ressource der Endpunkt gehört, um eine korrekte Tokenvalidierung gegenüber den konfigurierten Autorisierungsservern zu ermöglichen.

Bearer-Authentifizierung mit JWT-Modus konfigurieren

Wenn dein OAuth / OIDC-Anbieter JWTs zur Autorisierung ausstellt, kannst du den integrierten JWT-Modus in MCP Auth verwenden. Er überprüft die JWT-Signatur, das Ablaufdatum und andere von dir angegebene Ansprüche; anschließend werden die Authentifizierungsinformationen im Request-Kontext für die weitere Verarbeitung in deiner MCP-Implementierung bereitgestellt.

Berechtigungsprüfung (Scope validation)

Hier ein Beispiel für die grundlegende Berechtigungsprüfung:

from mcpauth import MCPAuth
from starlette.applications import Starlette
from starlette.middleware import Middleware
from starlette.routing import Mount
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("MyMCPServer")
mcp_auth = MCPAuth(
    # Initialisiere mit deiner Auth-Server-Konfiguration
)
bearer_auth = mcp_auth.bearer_auth_middleware("jwt", 
    resource="https://api.example.com",  # Gib an, zu welcher Ressource dieser Endpunkt gehört
    audience="https://api.example.com",  # Aktiviere die Zielgruppenvalidierung für Sicherheit
    required_scopes=["read", "write"] 
)

app = Starlette(
    routes=[Mount('/', app=mcp.sse_app(), middleware=[Middleware(bearer_auth)])]
)

Im obigen Beispiel haben wir angegeben, dass das JWT die Berechtigungen read und write benötigt. Wenn das JWT keine dieser Berechtigungen enthält, wird die Anfrage mit einem 403 Forbidden-Fehler abgelehnt.

Zielgruppenvalidierung (Audience validation, RFC 8707)

Für eine sichere Tokenvalidierung solltest du immer die Zielgruppenvalidierung aktivieren, indem du den Parameter audience angibst. Dadurch wird der aud (Zielgruppe)-Anspruch im JWT validiert, um sicherzustellen, dass das Token speziell für deine MCP-Server-Ressource ausgestellt wurde.

Audience Validation

Der Parameter audience ist gemäß der OAuth 2.0-Spezifikation für eine sichere Tokenvalidierung erforderlich. Er ist jedoch derzeit optional, um die Kompatibilität mit Autorisierungsservern zu gewährleisten, die noch keine Ressourcenindikatoren unterstützen. Aus Sicherheitsgründen bitte immer den Audience-Parameter angeben, wenn möglich. Zukünftige Versionen werden die Zielgruppenvalidierung verpflichtend machen, um die Spezifikation vollständig zu erfüllen.

Der Audience-Wert sollte in der Regel mit deinem Ressourcenindikator übereinstimmen:

bearer_auth = mcp_auth.bearer_auth_middleware(
    "jwt",
    resource="https://api.example.com",  # Gib an, zu welcher Ressource dieser Endpunkt gehört
    audience="https://api.example.com",  # Aktiviere die Zielgruppenvalidierung für Sicherheit
    required_scopes=["read", "write"]
)

Im obigen Beispiel validiert MCP Auth sowohl den aud-Anspruch im JWT als auch die erforderlichen Berechtigungen.

Benutzerdefinierte Optionen für die JWT-Überprüfung angeben

Du kannst auch benutzerdefinierte Optionen an die zugrunde liegende JWT-Überprüfungsbibliothek übergeben:

Im Python SDK verwenden wir PyJWT für die JWT-Überprüfung. Du kannst folgende Optionen nutzen:

  • leeway: Erlaubt eine gewisse Toleranz bei der Überprüfung der JWT-Ablaufzeit (in Sekunden). Standard ist 60 Sekunden.
bearer_auth = mcp_auth.bearer_auth_middleware(
    "jwt",
    resource="https://api.example.com",
    audience="https://api.example.com",
    required_scopes=["read", "write"],
    leeway=10,  # Reduziere Zeitabweichungen, indem du 10 Sekunden Toleranz erlaubst
)

Bearer-Authentifizierung mit benutzerdefinierter Überprüfung konfigurieren

Wenn dein OAuth / OIDC-Anbieter keine JWTs ausstellt oder du deine eigene Autorisierungslogik implementieren möchtest, erlaubt dir MCP Auth, eine benutzerdefinierte Überprüfungsfunktion zu erstellen:

info

Da das Bearer-Auth-Middleware den Aussteller (iss), die Zielgruppe (aud) und die erforderlichen Berechtigungen (scope) mit dem Überprüfungsergebnis abgleicht, musst du diese Prüfungen nicht in deiner benutzerdefinierten Überprüfungsfunktion implementieren. Du kannst dich darauf konzentrieren, die Token-Gültigkeit zu überprüfen (z. B. Signatur, Ablauf usw.) und das Auth-Info-Objekt zurückzugeben.

from mcpauth.exceptions import MCPAuthJwtVerificationException, MCPAuthJwtVerificationExceptionCode
from mcpauth.types import AuthInfo

async def custom_verification(token: str) -> AuthInfo:
    # Implementiere hier deine benutzerdefinierte Überprüfungslogik
    info = await verify_token(token)
    if not info:
        raise MCPAuthJwtVerificationException(
            MCPAuthJwtVerificationExceptionCode.JWT_VERIFICATION_FAILED
        )
    return info  # Gib das Auth-Info-Objekt zurück

bearer_auth = mcp_auth.bearer_auth_middleware(
    custom_verification,
    resource="https://api.example.com",
    audience="https://api.example.com",  # Aktiviere die Zielgruppenvalidierung für Sicherheit
    required_scopes=["read", "write"]
)

Bearer-Authentifizierung in deinem MCP-Server anwenden

Um deinen MCP-Server mit Bearer-Authentifizierung zu schützen, musst du das Bearer-Auth-Middleware auf deine MCP-Server-Instanz anwenden.

bearer_auth = mcp_auth.bearer_auth_middleware("jwt", 
    resource="https://api.example.com",
    audience="https://api.example.com",  # Aktiviere die Zielgruppenvalidierung für Sicherheit
    required_scopes=["read", "write"]
)
app = Starlette(
    routes=[Mount('/', app=mcp.sse_app(), middleware=[Middleware(bearer_auth)])]
)

Dadurch wird sichergestellt, dass alle eingehenden Anfragen gemäß den konfigurierten Bearer-Auth-Einstellungen authentifiziert und autorisiert werden und die Auth-Informationen im Request-Kontext verfügbar sind.

Du kannst die Informationen dann in deiner MCP-Server-Implementierung abrufen:

@mcp.tool()
async def whoami() -> dict:
    # `mcp_auth.auth_info` ist das Kontextobjekt für die aktuelle Anfrage
    auth_info = mcp_auth.auth_info
    print(f"Authentifizierter Benutzer: {auth_info.subject}")
    return {"subject": auth_info.subject}