55from typing import Any
66
77try :
8- import grpc
98 from grpc import ServicerContext
109 from grpc .aio import ServicerContext as AsyncServicerContext
1110
@@ -116,18 +115,21 @@ def dependency(
116115 request : Request ,
117116 token : HTTPAuthorizationCredentials = Security (security ),
118117 keycloak : KeycloakAdapter = Depends (cls ._get_keycloak_adapter ),
119- ) -> dict :
118+ ) -> dict [ str , Any ] :
120119 if token is None :
121120 raise UnauthenticatedError (lang = lang )
122121 token_str = token .credentials # Extract the token string
123122 # Validate token
124123 if not keycloak .validate_token (token_str ):
125124 token_info = keycloak .introspect_token (token_str )
126- if not token_info .get ("active" , False ):
125+ if not token_info or not token_info .get ("active" , False ):
127126 raise TokenExpiredError (lang = lang )
128127
129128 # Get user info from token
130129 user_info = keycloak .get_userinfo (token_str )
130+ if not user_info :
131+ raise UnauthenticatedError (lang = lang )
132+
131133 token_info = keycloak .get_token_info (token_str )
132134
133135 # Resource-based authorization if resource type is provided
@@ -219,7 +221,7 @@ async def dependency(
219221 request : Request ,
220222 token : HTTPAuthorizationCredentials = Security (security ),
221223 keycloak : AsyncKeycloakAdapter = Depends (cls ._get_async_keycloak_adapter ),
222- ) -> dict :
224+ ) -> dict [ str , Any ] :
223225 if token is None :
224226 raise UnauthenticatedError (lang = lang )
225227 token_str = token .credentials # Extract the token string
@@ -228,11 +230,14 @@ async def dependency(
228230 if not await keycloak .validate_token (token_str ):
229231 # Handle token validation error
230232 token_info = await keycloak .introspect_token (token_str )
231- if not token_info .get ("active" , False ):
233+ if not token_info or not token_info .get ("active" , False ):
232234 raise TokenExpiredError (lang = lang )
233235
234236 # Get user info from token
235237 user_info = await keycloak .get_userinfo (token_str )
238+ if not user_info :
239+ raise UnauthenticatedError (lang = lang )
240+
236241 token_info = await keycloak .get_token_info (token_str )
237242
238243 # Resource-based authorization if resource type is provided
@@ -287,6 +292,8 @@ async def dependency(
287292 # Add user info to request state
288293 request .state .user_info = user_info
289294 request .state .token_info = token_info
295+ if not user_info :
296+ raise UnauthenticatedError (lang = lang )
290297 return user_info
291298
292299 return dependency
@@ -302,11 +309,11 @@ def _extract_token_from_metadata(context: ServicerContext) -> str | None:
302309 if key in metadata :
303310 auth_value = metadata [key ]
304311 if auth_value .startswith ("Bearer " ):
305- return auth_value [7 :]
312+ return str ( auth_value [7 :])
306313 elif auth_value .startswith ("bearer " ):
307- return auth_value [7 :]
314+ return str ( auth_value [7 :])
308315 else :
309- return auth_value
316+ return str ( auth_value )
310317
311318 return None
312319
@@ -356,11 +363,13 @@ def wrapper(self: object, request: object, context: ServicerContext) -> object:
356363 # 3. Validate token
357364 if not keycloak .validate_token (token_str ):
358365 token_info = keycloak .introspect_token (token_str )
359- if not token_info .get ("active" , False ):
366+ if not token_info or not token_info .get ("active" , False ):
360367 raise TokenExpiredError (lang = lang )
361368
362369 # 4. Get user info from token
363370 user_info = keycloak .get_userinfo (token_str )
371+ if not user_info :
372+ raise UnauthenticatedError (lang = lang )
364373
365374 # 5. Resource-based authorization if resource_attribute_name is provided
366375 if resource_attribute_name :
@@ -494,11 +503,13 @@ async def wrapper(self: object, request: object, context: AsyncServicerContext)
494503 # 3. Validate token
495504 if not await keycloak .validate_token (token_str ):
496505 token_info = await keycloak .introspect_token (token_str )
497- if not token_info .get ("active" , False ):
506+ if not token_info or not token_info .get ("active" , False ):
498507 raise TokenExpiredError (lang = lang )
499508
500509 # 4. Get user info from token
501510 user_info = await keycloak .get_userinfo (token_str )
511+ if not user_info :
512+ raise UnauthenticatedError (lang = lang )
502513
503514 # 5. Resource-based authorization if resource_attribute_name is provided
504515 if resource_attribute_name :
@@ -573,10 +584,12 @@ async def wrapper(self: object, request: object, context: AsyncServicerContext)
573584 except Exception as e :
574585 if isinstance (e , BaseError ):
575586 await e .abort_grpc_async (context )
587+ return None # abort_grpc_async will terminate, but satisfy type checker
576588 await InternalError (
577589 lang = lang ,
578590 additional_data = {"original_error" : str (e ), "error_type" : type (e ).__name__ },
579591 ).abort_grpc_async (context )
592+ return None # abort_grpc_async will terminate, but satisfy type checker
580593
581594 finally :
582595 # Clean up auth context
0 commit comments