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:
- Python
- Node.js
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)])]
)
import express from 'express';
import { MCPAuth } from 'mcp-auth';
const app = express();
const mcpAuth = new MCPAuth({
/* ... */
});
const bearerAuth = mcpAuth.bearerAuth('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
requiredScopes: ['read', 'write']
});
app.use('/mcp', bearerAuth, (req, res) => {
// Jetzt enthält `req.auth` die Auth-Informationen
console.log(req.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.
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:
- Python
- Node.js
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"]
)
const bearerAuth = mcpAuth.bearerAuth('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
requiredScopes: ['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:
- Python
- Node.js
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
)
Im Node.js SDK verwenden wir die jose-Bibliothek für die JWT-Überprüfung. Du kannst folgende Optionen angeben:
jwtVerify
: Optionen für den JWT-Überprüfungsprozess (jwtVerify
-Funktion vonjose
).remoteJwtSet
: Optionen für das Abrufen des Remote-JWT-Sets (createRemoteJWKSet
-Funktion vonjose
).
const bearerAuth = mcpAuth.bearerAuth('jwt', {
resource: 'https://api.example.com',
audience: 'https://api.example.com',
requiredScopes: ['read', 'write'],
jwtVerify: {
clockTolerance: 60, // Erlaube eine Zeitabweichung von 60 Sekunden
},
remoteJwtSet: {
timeoutDuration: 10 * 1000, // 10 Sekunden Timeout für das Abrufen des Remote-JWT-Sets
},
});
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:
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.
- Python
- Node.js
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"]
)
const bearerAuth = mcpAuth.bearerAuth(
async (token) => {
// Implementiere hier deine benutzerdefinierte Überprüfungslogik
const info = await verifyToken(token);
if (!info) {
throw new MCPAuthJwtVerificationError('jwt_verification_failed');
}
return info; // Gib das Auth-Info-Objekt zurück
},
{
resource: 'https://api.example.com',
audience: 'https://api.example.com', // Aktiviere die Zielgruppenvalidierung für Sicherheit
requiredScopes: ['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.
- Python
- Node.js
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)])]
)
const app = express();
app.use(mcpAuth.bearerAuth('jwt', {
resource: 'https://api.example.com',
audience: 'https://api.example.com', // Aktiviere die Zielgruppenvalidierung für Sicherheit
requiredScopes: ['read', 'write']
}));
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:
- Python
- Node.js
@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}
// `authInfo` wird aus dem `req.auth`-Objekt übernommen
server.tool('whoami', ({ authInfo }) => {
console.log(`Authentifizierter Benutzer: ${authInfo.subject}`);
return { subject: authInfo.subject };
});