Saltar al contenido principal

Configura la autenticación Bearer en el servidor MCP

MCP Auth proporciona varias formas de configurar la autorización Bearer en tu servidor MCP:

  • Modo JWT (JSON Web Token): Un método de autorización integrado que verifica JWTs con aserciones de reclamos.
  • Modo personalizado: Te permite implementar tu propia lógica de autorización.

Configura la autenticación Bearer con el modo JWT

Si tu proveedor OAuth / OIDC emite JWTs para la autorización, puedes usar el modo JWT integrado en MCP Auth. Este verifica la firma del JWT, la expiración y otros reclamos que especifiques; luego, rellena la información de autenticación en el contexto de la solicitud para su posterior procesamiento en tu implementación MCP.

Validación de alcance (Scope)

Aquí tienes un ejemplo de la validación básica de alcances:

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

En el ejemplo anterior, especificamos que el JWT requiere los alcances (scopes) read y write. Si el JWT no contiene ninguno de estos alcances, la solicitud será rechazada con un error 403 Forbidden.

Validación del indicador de recurso (RFC 8707)

Si tu proveedor está basado en OIDC, o admite la extensión Resource Indicator, también puedes especificar la opción audience para validar el reclamo aud (audiencia) en el JWT. Esto es útil para asegurar que el JWT está destinado a tu servidor MCP.

Consulta la documentación de tu proveedor para ver si admite la extensión Resource Indicator y cómo configurarla. Algunos proveedores pueden usar otros términos como "audience", "API resource" o "API indicator" para referirse al mismo concepto.

Una vez que el indicador de recurso esté configurado, puedes especificarlo en el middleware bearerAuth:

bearer_auth = mcp_auth.bearer_auth_middleware(
    "jwt",
    audience="https://api.example.com/mcp",  # La audiencia esperada para el JWT
    required_scopes=["read", "write"]
)

En el ejemplo anterior, MCP Auth validará tanto el reclamo aud en el JWT como los alcances requeridos.

Proporciona opciones personalizadas a la verificación JWT

También puedes proporcionar opciones personalizadas a la biblioteca subyacente de verificación JWT:

En el SDK de Python, usamos PyJWT para la verificación de JWT. Puedes usar las siguientes opciones:

  • leeway: Permite cierta tolerancia al verificar el tiempo de expiración del JWT (en segundos). El valor predeterminado es 60 segundos.
bearer_auth = mcp_auth.bearer_auth_middleware(
    "jwt",
    audience="https://api.example.com/mcp",
    required_scopes=["read", "write"]
    leeway=10,  # Reduce la diferencia de reloj permitiendo 10 segundos de tolerancia
)

Configura la autenticación Bearer con verificación personalizada

Si tu proveedor OAuth / OIDC no emite JWTs, o deseas implementar tu propia lógica de autorización, MCP Auth te permite crear una función de verificación personalizada:

info

Dado que el middleware de autenticación Bearer verificará el emisor (iss), la audiencia (aud) y los alcances requeridos (scope) con el resultado de la verificación proporcionado, no es necesario implementar estas comprobaciones en tu función de verificación personalizada. Puedes centrarte en verificar la validez del token (por ejemplo, firma, expiración, etc.) y devolver el objeto de información de autenticación.

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

async def custom_verification(token: str) -> AuthInfo:
    # Implementa aquí tu lógica personalizada de verificación
    info = await verify_token(token)
    if not info:
        raise MCPAuthJwtVerificationException(
            MCPAuthJwtVerificationExceptionCode.JWT_VERIFICATION_FAILED
        )
    return info  # Devuelve el objeto de información de autenticación

bearer_auth = mcp_auth.bearer_auth_middleware(
    custom_verification,
    required_scopes=["read", "write"]
)

Aplica la autenticación Bearer en tu servidor MCP

Para proteger tu servidor MCP con autenticación Bearer, necesitas aplicar el middleware de autenticación Bearer a tu instancia del servidor 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)])]
)

Esto asegurará que todas las solicitudes entrantes sean autenticadas y autorizadas de acuerdo con la configuración de autenticación Bearer, y la información de autenticación estará disponible en el contexto de la solicitud.

Luego puedes acceder a la información en tu implementación del servidor MCP:

@mcp.tool()
async def whoami() -> dict:
    # `mcp_auth.auth_info` es el objeto de contexto para la solicitud actual
    auth_info = mcp_auth.auth_info
    print(f"Usuario autenticado: {auth_info.subject}")
    return {"subject": auth_info.subject}