Issue 1379 patch - Fix MCP server OAuth not working with Visual Studio Code and others with extra grant_types (#1380)
This commit is contained in:
parent
1940040ac3
commit
9323efad99
3 changed files with 19 additions and 2 deletions
|
|
@ -68,7 +68,7 @@ class RegistrationHandler:
|
||||||
),
|
),
|
||||||
status_code=400,
|
status_code=400,
|
||||||
)
|
)
|
||||||
if set(client_metadata.grant_types) != {"authorization_code", "refresh_token"}:
|
if not {"authorization_code", "refresh_token"}.issubset(set(client_metadata.grant_types)):
|
||||||
return PydanticJSONResponse(
|
return PydanticJSONResponse(
|
||||||
content=RegistrationErrorResponse(
|
content=RegistrationErrorResponse(
|
||||||
error="invalid_client_metadata",
|
error="invalid_client_metadata",
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ class OAuthClientMetadata(BaseModel):
|
||||||
# ie: we do not support client_secret_basic
|
# ie: we do not support client_secret_basic
|
||||||
token_endpoint_auth_method: Literal["none", "client_secret_post"] = "client_secret_post"
|
token_endpoint_auth_method: Literal["none", "client_secret_post"] = "client_secret_post"
|
||||||
# grant_types: this implementation only supports authorization_code & refresh_token
|
# grant_types: this implementation only supports authorization_code & refresh_token
|
||||||
grant_types: list[Literal["authorization_code", "refresh_token"]] = [
|
grant_types: list[Literal["authorization_code", "refresh_token"] | str] = [
|
||||||
"authorization_code",
|
"authorization_code",
|
||||||
"refresh_token",
|
"refresh_token",
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -937,6 +937,23 @@ class TestAuthEndpoints:
|
||||||
assert error_data["error"] == "invalid_client_metadata"
|
assert error_data["error"] == "invalid_client_metadata"
|
||||||
assert error_data["error_description"] == "grant_types must be authorization_code and refresh_token"
|
assert error_data["error_description"] == "grant_types must be authorization_code and refresh_token"
|
||||||
|
|
||||||
|
@pytest.mark.anyio
|
||||||
|
async def test_client_registration_with_additional_grant_type(self, test_client: httpx.AsyncClient):
|
||||||
|
client_metadata = {
|
||||||
|
"redirect_uris": ["https://client.example.com/callback"],
|
||||||
|
"client_name": "Test Client",
|
||||||
|
"grant_types": ["authorization_code", "refresh_token", "urn:ietf:params:oauth:grant-type:device_code"],
|
||||||
|
}
|
||||||
|
|
||||||
|
response = await test_client.post("/register", json=client_metadata)
|
||||||
|
assert response.status_code == 201
|
||||||
|
client_info = response.json()
|
||||||
|
|
||||||
|
# Verify client was registered successfully
|
||||||
|
assert "client_id" in client_info
|
||||||
|
assert "client_secret" in client_info
|
||||||
|
assert client_info["client_name"] == "Test Client"
|
||||||
|
|
||||||
@pytest.mark.anyio
|
@pytest.mark.anyio
|
||||||
async def test_client_registration_with_additional_response_types(
|
async def test_client_registration_with_additional_response_types(
|
||||||
self, test_client: httpx.AsyncClient, mock_oauth_provider: MockOAuthProvider
|
self, test_client: httpx.AsyncClient, mock_oauth_provider: MockOAuthProvider
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue