@@ -263,6 +263,50 @@ def test_clear_tokens(self, oauth_provider: OAuthClientProvider, valid_tokens: O
263263class TestOAuthFlow :
264264 """Test OAuth flow methods."""
265265
266+ @pytest .mark .anyio
267+ async def test_authorization_endpoint_query_params_are_preserved (
268+ self , client_metadata : OAuthClientMetadata , mock_storage : MockTokenStorage
269+ ):
270+ """OAuth authorization endpoints may already carry provider-specific query params."""
271+ captured_state : str | None = None
272+
273+ async def redirect_handler (url : str ) -> None :
274+ nonlocal captured_state
275+ parsed = urlparse (url )
276+ params = parse_qs (parsed .query )
277+
278+ assert params ["prompt" ] == ["select_account" ]
279+ assert params ["response_type" ] == ["code" ]
280+ assert params ["client_id" ] == ["test_client" ]
281+
282+ captured_state = params .get ("state" , [None ])[0 ]
283+
284+ async def callback_handler () -> tuple [str , str | None ]:
285+ return "test_auth_code" , captured_state
286+
287+ provider = OAuthClientProvider (
288+ server_url = "https://api.example.com/v1/mcp" ,
289+ client_metadata = client_metadata ,
290+ storage = mock_storage ,
291+ redirect_handler = redirect_handler ,
292+ callback_handler = callback_handler ,
293+ )
294+ provider .context .oauth_metadata = OAuthMetadata (
295+ issuer = AnyHttpUrl ("https://auth.example.com" ),
296+ authorization_endpoint = AnyHttpUrl ("https://auth.example.com/authorize?prompt=select_account" ),
297+ token_endpoint = AnyHttpUrl ("https://auth.example.com/token" ),
298+ )
299+ provider .context .client_info = OAuthClientInformationFull (
300+ client_id = "test_client" ,
301+ client_secret = "test_secret" ,
302+ redirect_uris = [AnyUrl ("http://localhost:3030/callback" )],
303+ )
304+
305+ auth_code , code_verifier = await provider ._perform_authorization_code_grant ()
306+
307+ assert auth_code == "test_auth_code"
308+ assert code_verifier
309+
266310 @pytest .mark .anyio
267311 async def test_build_protected_resource_discovery_urls (
268312 self , client_metadata : OAuthClientMetadata , mock_storage : MockTokenStorage
0 commit comments