Skip to content

Commit 7431e7f

Browse files
committed
revert refactor of pkce generation
1 parent c3280d9 commit 7431e7f

File tree

2 files changed

+7
-39
lines changed

2 files changed

+7
-39
lines changed

src/mcp/client/auth/oauth2.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
Implements authorization code flow with PKCE and automatic token refresh.
55
"""
66

7+
import base64
8+
import hashlib
79
import logging
810
import secrets
11+
import string
912
import time
1013
from collections.abc import AsyncGenerator, Awaitable, Callable
1114
from dataclasses import dataclass, field
@@ -42,7 +45,6 @@
4245
from mcp.shared.auth_utils import (
4346
calculate_token_expiry,
4447
check_resource_allowed,
45-
generate_pkce_parameters,
4648
resource_url_from_server_url,
4749
)
4850

@@ -57,8 +59,10 @@ class PKCEParameters(BaseModel):
5759

5860
@classmethod
5961
def generate(cls) -> "PKCEParameters":
60-
"""Generate new PKCE parameters using shared util function."""
61-
code_verifier, code_challenge = generate_pkce_parameters(verifier_length=128)
62+
"""Generate new PKCE parameters."""
63+
code_verifier = "".join(secrets.choice(string.ascii_letters + string.digits + "-._~") for _ in range(128))
64+
digest = hashlib.sha256(code_verifier.encode()).digest()
65+
code_challenge = base64.urlsafe_b64encode(digest).decode().rstrip("=")
6266
return cls(code_verifier=code_verifier, code_challenge=code_challenge)
6367

6468

src/mcp/shared/auth_utils.py

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
"""Utilities for OAuth 2.0 Resource Indicators (RFC 8707) and PKCE (RFC 7636)."""
22

3-
import base64
4-
import hashlib
5-
import secrets
6-
import string
73
import time
84
from urllib.parse import urlparse, urlsplit, urlunsplit
95

@@ -74,38 +70,6 @@ def check_resource_allowed(requested_resource: str, configured_resource: str) ->
7470
return requested_path.startswith(configured_path)
7571

7672

77-
def generate_pkce_parameters(verifier_length: int = 128) -> tuple[str, str]:
78-
"""Generate PKCE verifier and challenge per RFC 7636.
79-
80-
Generates cryptographically secure code_verifier and code_challenge
81-
for OAuth 2.0 PKCE (Proof Key for Code Exchange).
82-
83-
Args:
84-
verifier_length: Length of code_verifier (43-128 chars per RFC 7636, default 128)
85-
86-
Returns:
87-
Tuple of (code_verifier, code_challenge)
88-
89-
Raises:
90-
ValueError: If verifier_length is not between 43 and 128
91-
"""
92-
if not 43 <= verifier_length <= 128:
93-
raise ValueError("verifier_length must be between 43 and 128 per RFC 7636") # pragma: no cover
94-
95-
# Generate code_verifier using unreserved characters per RFC 7636 Section 4.1
96-
# unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
97-
code_verifier = "".join(
98-
secrets.choice(string.ascii_letters + string.digits + "-._~") for _ in range(verifier_length)
99-
)
100-
101-
# Generate code_challenge using S256 method per RFC 7636 Section 4.2
102-
# code_challenge = BASE64URL(SHA256(ASCII(code_verifier)))
103-
digest = hashlib.sha256(code_verifier.encode("ascii")).digest()
104-
code_challenge = base64.urlsafe_b64encode(digest).decode("ascii").rstrip("=")
105-
106-
return code_verifier, code_challenge
107-
108-
10973
def calculate_token_expiry(expires_in: int | str | None) -> float | None:
11074
"""Calculate token expiry timestamp from expires_in seconds.
11175

0 commit comments

Comments
 (0)