Configurer l’auth Bearer dans le serveur MCP
MCP Auth propose différentes façons de configurer l’Autorisation Bearer dans votre serveur MCP :
- Mode JWT (JSON Web Token) : Une méthode d’autorisation intégrée qui vérifie les JWT avec des assertions de revendications (claims).
- Mode personnalisé : Vous permet d’implémenter votre propre logique d’autorisation.
Configurer l’auth Bearer avec le mode JWT
Si votre fournisseur OAuth / OIDC émet des JWT pour l’autorisation, vous pouvez utiliser le mode JWT intégré dans MCP Auth. Il vérifie la signature du JWT, l’expiration et d’autres revendications que vous spécifiez ; puis il renseigne les informations d’authentification dans le contexte de la requête pour un traitement ultérieur dans votre implémentation MCP.
Validation de la portée (Scope)
Voici un exemple de validation de portée de base :
- 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(
# Initialize with your auth server config
)
bearer_auth = mcp_auth.bearer_auth_middleware("jwt", 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', { requiredScopes: ['read', 'write'] });
app.use('/mcp', bearerAuth, (req, res) => {
// Now `req.auth` contains the auth info
console.log(req.auth);
});
Dans l’exemple ci-dessus, nous avons spécifié que le JWT nécessite les portées (scopes) read
et write
. Si le JWT ne contient aucune de ces portées, la requête sera rejetée avec une erreur 403 Forbidden.
Validation de l’indicateur de ressource (RFC 8707)
Si votre fournisseur est basé sur OIDC, ou prend en charge l’extension Indicateur de ressource (Resource Indicator), vous pouvez également spécifier l’option audience
pour valider la revendication aud
(audience) dans le JWT. Ceci est utile pour s’assurer que le JWT est destiné à votre serveur MCP.
Consultez la documentation de votre fournisseur pour vérifier s’il prend en charge l’extension Indicateur de ressource et comment la configurer. Certains fournisseurs peuvent utiliser d’autres termes comme "audience", "ressource API" ou "indicateur API" pour désigner le même concept.
Une fois l’indicateur de ressource configuré, vous pouvez le spécifier dans le middleware bearerAuth
:
- Python
- Node.js
bearer_auth = mcp_auth.bearer_auth_middleware(
"jwt",
audience="https://api.example.com/mcp", # L’audience attendue pour le JWT
required_scopes=["read", "write"]
)
const bearerAuth = mcpAuth.bearerAuth('jwt', {
audience: 'https://api.example.com/mcp', // L’audience attendue pour le JWT
requiredScopes: ['read', 'write'],
});
Dans l’exemple ci-dessus, MCP Auth validera à la fois la revendication aud
dans le JWT et les portées requises.
Fournir des options personnalisées à la vérification du JWT
Vous pouvez également fournir des options personnalisées à la bibliothèque de vérification JWT sous-jacente :
- Python
- Node.js
Dans le SDK Python, nous utilisons PyJWT pour la vérification des JWT. Vous pouvez utiliser les options suivantes :
leeway
: Autorise une certaine marge lors de la vérification de l’expiration du JWT (en secondes). La valeur par défaut est de 60 secondes.
bearer_auth = mcp_auth.bearer_auth_middleware(
"jwt",
audience="https://api.example.com/mcp",
required_scopes=["read", "write"]
leeway=10, # Réduit le décalage d’horloge en autorisant 10 secondes de marge
)
Dans le SDK Node.js, nous utilisons la bibliothèque jose pour la vérification des JWT. Vous pouvez fournir les options suivantes :
jwtVerify
: Options pour le processus de vérification JWT (fonctionjwtVerify
dejose
).remoteJwtSet
: Options pour la récupération du jeu JWT distant (fonctioncreateRemoteJWKSet
dejose
).
const bearerAuth = mcpAuth.bearerAuth('jwt', {
audience: 'https://api.example.com/mcp',
requiredScopes: ['read', 'write'],
jwtVerify: {
clockTolerance: 60, // Autorise un décalage d’horloge de 60 secondes
},
remoteJwtSet: {
timeoutDuration: 10 * 1000, // Délai de 10 secondes pour la récupération du jeu JWT distant
},
});
Configurer l’auth Bearer avec une vérification personnalisée
Si votre fournisseur OAuth / OIDC n’émet pas de JWT, ou si vous souhaitez implémenter votre propre logique d’autorisation, MCP Auth vous permet de créer une fonction de vérification personnalisée :
Étant donné que le middleware d’auth Bearer vérifiera l’émetteur (iss
), l’audience (aud
) et les portées requises (scope
) avec le résultat de la vérification fourni, il n’est pas nécessaire d’implémenter ces vérifications dans votre fonction de vérification personnalisée. Vous pouvez vous concentrer sur la vérification de la validité du jeton (par exemple, signature, expiration, etc.) et le retour de l’objet d’informations d’authentification.
- Python
- Node.js
from mcpauth.exceptions import MCPAuthJwtVerificationException, MCPAuthJwtVerificationExceptionCode
from mcpauth.types import AuthInfo
async def custom_verification(token: str) -> AuthInfo:
# Implémentez ici votre logique de vérification personnalisée
info = await verify_token(token)
if not info:
raise MCPAuthJwtVerificationException(
MCPAuthJwtVerificationExceptionCode.JWT_VERIFICATION_FAILED
)
return info # Retournez l’objet d’informations d’authentification
bearer_auth = mcp_auth.bearer_auth_middleware(
custom_verification,
required_scopes=["read", "write"]
)
const bearerAuth = mcpAuth.bearerAuth(
async (token) => {
// Implémentez ici votre logique de vérification personnalisée
const info = await verifyToken(token);
if (!info) {
throw new MCPAuthJwtVerificationError('jwt_verification_failed');
}
return info; // Retournez l’objet d’informations d’authentification
},
{ requiredScopes: ['read', 'write'] }
);
Appliquer l’auth Bearer dans votre serveur MCP
Pour protéger votre serveur MCP avec l’auth Bearer, vous devez appliquer le middleware d’auth Bearer à votre instance de serveur MCP.
- Python
- Node.js
bearer_auth = mcp_auth.bearer_auth_middleware("jwt", required_scopes=["read", "write"])
app = Starlette(
routes=[Mount('/', app=mcp.sse_app(), middleware=[Middleware(bearer_auth)])]
)
const app = express();
app.use(mcpAuth.bearerAuth('jwt', { requiredScopes: ['read', 'write'] }));
Cela garantira que toutes les requêtes entrantes sont authentifiées et autorisées selon les paramètres d’auth Bearer configurés, et que les informations d’authentification seront disponibles dans le contexte de la requête.
Vous pouvez ensuite accéder à ces informations dans votre implémentation du serveur MCP :
- Python
- Node.js
@mcp.tool()
async def whoami() -> dict:
# `mcp_auth.auth_info` est l’objet de contexte pour la requête en cours
auth_info = mcp_auth.auth_info
print(f"Utilisateur authentifié : {auth_info.subject}")
return {"subject": auth_info.subject}
// `authInfo` sera transmis depuis l’objet `req.auth`
server.tool('whoami', ({ authInfo }) => {
console.log(`Utilisateur authentifié : ${authInfo.subject}`);
return { subject: authInfo.subject };
});