@@ -37,22 +37,18 @@ def info(self, settings: GatewaySettings) -> str:
3737 return f"\t UI: { url } ?token={ self .api_key } "
3838 return f"\t API: { url } /openapi.json?token={ self .api_key } "
3939
40- def rest (self , app : GatewayWebApp ) -> None :
41- # reinitialize header
42- api_key_query = APIKeyQuery (name = self .api_key_name , auto_error = False )
43- api_key_header = APIKeyHeader (name = self .api_key_name , auto_error = False )
44- api_key_cookie = APIKeyCookie (name = self .api_key_name , auto_error = False )
45-
46- # routers
47- auth_router : APIRouter = app .get_router ("auth" )
48-
49- # now mount middleware
50- async def get_api_key (
51- api_key_query : str = Security (api_key_query ),
52- api_key_header : str = Security (api_key_header ),
53- api_key_cookie : str = Security (api_key_cookie ),
54- ):
55- # Support both single string and list of valid API keys
40+ def validate (self ):
41+ """Return a FastAPI dependency function for API key validation."""
42+ api_key_query_security = Security (APIKeyQuery (name = self .api_key_name , auto_error = False ))
43+ api_key_header_security = Security (APIKeyHeader (name = self .api_key_name , auto_error = False ))
44+ api_key_cookie_security = Security (APIKeyCookie (name = self .api_key_name , auto_error = False ))
45+
46+ async def validate_credentials (
47+ api_key_query : str = api_key_query_security ,
48+ api_key_header : str = api_key_header_security ,
49+ api_key_cookie : str = api_key_cookie_security ,
50+ ) -> str :
51+ """Validate API key from query, header, or cookie."""
5652 valid_keys = self .api_key if isinstance (self .api_key , list ) else [self .api_key ]
5753 for provided_key in (api_key_query , api_key_header , api_key_cookie ):
5854 if provided_key in valid_keys :
@@ -62,8 +58,15 @@ async def get_api_key(
6258 detail = self .unauthorized_status_message ,
6359 )
6460
61+ return validate_credentials
62+
63+ def rest (self , app : GatewayWebApp ) -> None :
64+ # routers
65+ auth_router : APIRouter = app .get_router ("auth" )
66+ check = self .get_check_dependency ()
67+
6568 @auth_router .get ("/login" )
66- async def route_login_and_add_cookie (api_key : str = Depends (get_api_key )):
69+ async def route_login_and_add_cookie (api_key : str = Depends (check )):
6770 response = RedirectResponse (url = "/" )
6871 response .set_cookie (
6972 self .api_key_name ,
@@ -81,10 +84,10 @@ async def route_logout_and_remove_cookie():
8184 response .delete_cookie (self .api_key_name , domain = self .domain )
8285 return response
8386
84- self ._setup_public_routes (app , get_api_key )
87+ self ._setup_public_routes (app )
8588
86- def _setup_public_routes (self , app : GatewayWebApp , get_api_key ) -> None :
87- """Setup public routes, middleware, and exception handler. Shared by subclasses."""
89+ def _setup_public_routes (self , app : GatewayWebApp ) -> None :
90+ """Setup public routes, middleware, and exception handler. Shared by subclasses.""" ""
8891 public_router : APIRouter = app .get_router ("public" )
8992
9093 @public_router .get ("/login" , response_class = HTMLResponse , include_in_schema = False )
@@ -102,7 +105,7 @@ async def get_logout_page(request: Request = None):
102105 return app .templates .TemplateResponse ("logout.html.j2" , {"request" : request })
103106
104107 # add auth to all other routes
105- app .add_middleware (Depends (get_api_key ))
108+ app .add_middleware (Depends (self . get_check_dependency () ))
106109
107110 @app .app .exception_handler (403 )
108111 async def custom_403_handler (request : Request = None , * args ):
0 commit comments