@@ -2005,6 +2005,14 @@ class TestWWWAuthenticate:
20052005 ),
20062006 # Multiple parameters with unquoted value
20072007 ('Bearer realm="api", scope=basic' , "scope" , "basic" ),
2008+ # Decoy parameter name before the real field
2009+ ('Bearer error_scope="decoy", scope="read write"' , "scope" , "read write" ),
2010+ (
2011+ 'Bearer x_resource_metadata="https://decoy.example.com", '
2012+ 'resource_metadata="https://api.example.com/.well-known/oauth-protected-resource"' ,
2013+ "resource_metadata" ,
2014+ "https://api.example.com/.well-known/oauth-protected-resource" ,
2015+ ),
20082016 # Values with special characters
20092017 (
20102018 'Bearer scope="resource:read resource:write user_profile"' ,
@@ -2047,6 +2055,12 @@ def test_extract_field_from_www_auth_valid_cases(
20472055 # Header without requested field
20482056 ('Bearer realm="api", error="insufficient_scope"' , "scope" , "no scope parameter" ),
20492057 ('Bearer realm="api", scope="read write"' , "resource_metadata" , "no resource_metadata parameter" ),
2058+ ('Bearer custom_scope="leaked"' , "scope" , "substring param name should not match scope" ),
2059+ (
2060+ 'Bearer x_resource_metadata="https://decoy.example.com"' ,
2061+ "resource_metadata" ,
2062+ "substring param name should not match resource_metadata" ,
2063+ ),
20502064 # Malformed field (empty value)
20512065 ("Bearer scope=" , "scope" , "malformed scope parameter" ),
20522066 ("Bearer resource_metadata=" , "resource_metadata" , "malformed resource_metadata parameter" ),
@@ -2070,6 +2084,18 @@ def test_extract_field_from_www_auth_invalid_cases(
20702084 result = extract_field_from_www_auth (init_response , field_name )
20712085 assert result is None , f"Should return None for { description } "
20722086
2087+ def test_extract_resource_metadata_from_www_auth_ignores_substring_param_name (self ):
2088+ """Test resource_metadata extraction ignores auth-params with longer names."""
2089+ init_response = httpx .Response (
2090+ status_code = 401 ,
2091+ headers = {"WWW-Authenticate" : 'Bearer x_resource_metadata="https://decoy.example.com"' },
2092+ request = httpx .Request ("GET" , "https://api.example.com/test" ),
2093+ )
2094+
2095+ result = extract_resource_metadata_from_www_auth (init_response )
2096+
2097+ assert result is None
2098+
20732099
20742100class TestCIMD :
20752101 """Test Client ID Metadata Document (CIMD) support."""
0 commit comments