Skip to content

Commit 2fbb687

Browse files
committed
fix(auth): drop duplicate validate_issuer_url and redundant redirect_uris guard
1 parent 9f80e4e commit 2fbb687

3 files changed

Lines changed: 16 additions & 35 deletions

File tree

src/mcp/server/auth/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
11
"""MCP OAuth server authorization components."""
2-
3-
from .url_validators import validate_issuer_url, validate_redirect_uri

src/mcp/server/auth/handlers/register.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import secrets
22
import time
33
from dataclasses import dataclass
4-
from typing import Any
4+
from typing import Any, cast
55
from uuid import uuid4
66

7-
from pydantic import BaseModel, ValidationError
7+
from pydantic import AnyUrl, BaseModel, ValidationError
88
from starlette.requests import Request
99
from starlette.responses import Response
1010

@@ -36,19 +36,20 @@ async def handle(self, request: Request) -> Response:
3636
body = await request.body()
3737
client_metadata = OAuthClientMetadata.model_validate_json(body)
3838

39-
# Validate redirect_uris per RFC 7591 section 2
40-
if client_metadata.redirect_uris:
41-
for uri in client_metadata.redirect_uris:
42-
try:
43-
validate_redirect_uri(uri)
44-
except ValueError as e:
45-
return PydanticJSONResponse(
46-
content=RegistrationErrorResponse(
47-
error="invalid_redirect_uri",
48-
error_description=str(e),
49-
),
50-
status_code=400,
51-
)
39+
# Validate redirect_uris per RFC 7591 section 2. The metadata
40+
# model requires a non-empty list (min_length=1), so no presence
41+
# guard is needed; cast narrows the optional field for pyright.
42+
for uri in cast(list[AnyUrl], client_metadata.redirect_uris):
43+
try:
44+
validate_redirect_uri(uri)
45+
except ValueError as e:
46+
return PydanticJSONResponse(
47+
content=RegistrationErrorResponse(
48+
error="invalid_redirect_uri",
49+
error_description=str(e),
50+
),
51+
status_code=400,
52+
)
5253

5354
# Scope validation is handled below
5455
except ValidationError as validation_error:

src/mcp/server/auth/url_validators.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,6 @@
88
from pydantic import AnyUrl
99

1010

11-
def validate_issuer_url(url: AnyUrl):
12-
"""Validate that the issuer URL meets OAuth 2.0 requirements.
13-
14-
Args:
15-
url: The issuer URL to validate.
16-
17-
Raises:
18-
ValueError: If the issuer URL is invalid.
19-
"""
20-
if url.scheme != "https" and not (url.scheme == "http" and url.host in ("localhost", "127.0.0.1", "[::1]")):
21-
raise ValueError("Issuer URL must be HTTPS")
22-
23-
if url.fragment:
24-
raise ValueError("Issuer URL must not have a fragment")
25-
if url.query:
26-
raise ValueError("Issuer URL must not have a query string")
27-
28-
2911
def validate_redirect_uri(url: AnyUrl):
3012
"""Validate a registered redirect_uri for DCR.
3113

0 commit comments

Comments
 (0)