Skip to content

Commit a233430

Browse files
committed
Cover legacy auth app configuration
1 parent ca565c3 commit a233430

2 files changed

Lines changed: 43 additions & 14 deletions

File tree

‎src/mcp/server/mcpserver/server.py‎

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1124,19 +1124,18 @@ async def handle_sse(scope: Scope, receive: Receive, send: Send): # pragma: no
11241124
# Set up auth if configured
11251125
if self.settings.auth:
11261126
required_scopes = self.settings.auth.required_scopes or []
1127-
1128-
# Add auth middleware if token verifier is available
1129-
if self._token_verifier:
1130-
middleware = [
1131-
# extract auth info from request (but do not require it)
1132-
Middleware(
1133-
AuthenticationMiddleware,
1134-
backend=BearerAuthBackend(self._token_verifier),
1135-
),
1136-
# Add the auth context middleware to store
1137-
# authenticated user in a contextvar
1138-
Middleware(AuthContextMiddleware),
1139-
]
1127+
assert self._token_verifier is not None
1128+
1129+
middleware = [
1130+
# extract auth info from request (but do not require it)
1131+
Middleware(
1132+
AuthenticationMiddleware,
1133+
backend=BearerAuthBackend(self._token_verifier),
1134+
),
1135+
# Add the auth context middleware to store
1136+
# authenticated user in a contextvar
1137+
Middleware(AuthContextMiddleware),
1138+
]
11401139

11411140
# Add auth endpoints if auth server provider is configured
11421141
if self._auth_server_provider:
@@ -1154,7 +1153,7 @@ async def handle_sse(scope: Scope, receive: Receive, send: Send): # pragma: no
11541153
)
11551154

11561155
# When auth is configured, require authentication
1157-
if self._token_verifier:
1156+
if self.settings.auth:
11581157
# Determine resource metadata URL
11591158
resource_metadata_url = None
11601159
if self.settings.auth and self.settings.auth.resource_server_url:

‎tests/examples/simple_auth/test_resource_server_urls.py‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import pytest
55
from click.testing import CliRunner, Result
66
from mcp_simple_auth import server
7+
from mcp_simple_auth.legacy_as_server import ServerSettings, create_simple_mcp_server
8+
from mcp_simple_auth.simple_auth_provider import SimpleAuthSettings
9+
from pydantic import AnyHttpUrl
710

811
from mcp.server.mcpserver.server import MCPServer
912

@@ -93,3 +96,30 @@ async def test_an_explicit_public_resource_url_is_preserved(monkeypatch: pytest.
9396

9497
assert metadata.status_code == 200
9598
assert metadata.json()["resource"] == public_url
99+
100+
101+
@pytest.mark.anyio
102+
async def test_legacy_authorization_server_omits_protected_resource_metadata() -> None:
103+
"""Legacy AS mode authenticates SSE without claiming a separate protected-resource URL."""
104+
server_settings = ServerSettings(
105+
host="localhost",
106+
port=8000,
107+
server_url=AnyHttpUrl("http://localhost:8000"),
108+
auth_callback_path="http://localhost:8000/login/callback",
109+
)
110+
auth_settings = SimpleAuthSettings(
111+
demo_username="demo_user",
112+
demo_password="demo_password",
113+
mcp_scope="user",
114+
)
115+
app = create_simple_mcp_server(server_settings, auth_settings).sse_app()
116+
117+
async with httpx2.AsyncClient(transport=httpx2.ASGITransport(app=app), base_url="http://localhost:8000") as client:
118+
authorization_metadata = await client.get("/.well-known/oauth-authorization-server")
119+
protected_resource_metadata = await client.get("/.well-known/oauth-protected-resource")
120+
unauthorized = await client.get("/sse")
121+
122+
assert authorization_metadata.status_code == 200
123+
assert protected_resource_metadata.status_code == 404
124+
assert unauthorized.status_code == 401
125+
assert "resource_metadata" not in unauthorized.headers["www-authenticate"]

0 commit comments

Comments
 (0)