55
66from a2a .client .auth .credentials import CredentialService
77from a2a .client .middleware import ClientCallContext , ClientCallInterceptor
8- from a2a .types import AgentCard , APIKeySecurityScheme , HTTPAuthSecurityScheme
8+ from a2a .types import AgentCard , APIKeySecurityScheme , HTTPAuthSecurityScheme , In , OAuth2SecurityScheme
99
1010logger = logging .getLogger (__name__ )
1111
@@ -27,35 +27,40 @@ async def intercept(
2727 agent_card : AgentCard | None ,
2828 context : ClientCallContext | None ,
2929 ) -> tuple [dict [str , Any ], dict [str , Any ]]:
30- """
31- Adds authentication headers to the request if credentials can be found.
32- """
3330 if not agent_card or not agent_card .security or not agent_card .securitySchemes :
3431 return request_payload , http_kwargs
3532
3633 for requirement in agent_card .security :
37- for scheme_name in requirement :
34+ for scheme_name in requirement : # Iterate through scheme names in the requirement
3835 credential = await self ._credential_service .get_credentials (
3936 scheme_name , context
4037 )
4138 if credential and scheme_name in agent_card .securitySchemes :
42- scheme_def = agent_card .securitySchemes [scheme_name ].root
39+ scheme_def_union = agent_card .securitySchemes [scheme_name ]
40+ if not scheme_def_union :
41+ continue
42+ scheme_def = scheme_def_union .root # SecurityScheme is a RootModel
43+
4344 headers = http_kwargs .get ('headers' , {})
4445
4546 if isinstance (scheme_def , HTTPAuthSecurityScheme ):
46- headers ['Authorization' ] = f"{ scheme_def .scheme } { credential } "
47+ if scheme_def .scheme .lower () == 'bearer' :
48+ headers ['Authorization' ] = f"Bearer { credential } "
49+ logger .debug (f"Added HTTP Bearer Auth for scheme '{ scheme_name } '." )
50+ http_kwargs ['headers' ] = headers
51+ return request_payload , http_kwargs
52+ elif isinstance (scheme_def , OAuth2SecurityScheme ): # New condition for OAuth2
53+ # For OAuth2, the credential obtained is the access token, used as a Bearer token.
54+ headers ['Authorization' ] = f"Bearer { credential } "
55+ logger .debug (f"Added OAuth2 Bearer token for scheme '{ scheme_name } '." )
4756 http_kwargs ['headers' ] = headers
48- logger .debug (f"Added HTTP Auth for scheme '{ scheme_name } '." )
4957 return request_payload , http_kwargs
5058 elif isinstance (scheme_def , APIKeySecurityScheme ):
51- if scheme_def .in_ == ' header' :
59+ if scheme_def .in_ == In . header : # Use In.header enum member
5260 headers [scheme_def .name ] = credential
53- http_kwargs ['headers' ] = headers
5461 logger .debug (f"Added API Key Header for scheme '{ scheme_name } '." )
62+ http_kwargs ['headers' ] = headers
5563 return request_payload , http_kwargs
56- else :
57- logger .warning (
58- f"API Key in '{ scheme_def .in_ } ' not supported by this interceptor."
59- )
60-
64+ # Note: API keys in query or cookie are not handled by this interceptor modification.
65+
6166 return request_payload , http_kwargs
0 commit comments