Aller au contenu principal

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 :

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)])]
)

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 :

bearer_auth = mcp_auth.bearer_auth_middleware(
    "jwt",
    audience="https://api.example.com/mcp",  # L’audience attendue pour le JWT
    required_scopes=["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 :

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
)

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 :

info

É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.

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"]
)

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.

bearer_auth = mcp_auth.bearer_auth_middleware("jwt", required_scopes=["read", "write"])
app = Starlette(
    routes=[Mount('/', app=mcp.sse_app(), middleware=[Middleware(bearer_auth)])]
)

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 :

@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}