77from fastapi .middleware .cors import CORSMiddleware
88
99from . import models
10- from .middleware import AuthMiddleware
10+ from .middleware . auth_middleware import AuthMiddleware
1111from .routes import auth , send_email , user
1212from .utilities .constants import LOGGER_NAME
1313from .utilities .firebase_init import initialize_firebase
@@ -73,7 +73,11 @@ def read_item(item_id: int, q: Union[str, None] = None):
7373async def test_middleware (request : Request ) -> Dict [str , Any ]:
7474 """
7575 Test endpoint that requires authentication and shows middleware-added state.
76- This will only work if you provide a valid Firebase token.
76+ This will only work if you provide a valid Firebase token in the Authorization header.
77+
78+ Example: Authorization: Bearer your-firebase-token
79+
80+ The response will show all user information added by the Firebase auth middleware.
7781 """
7882 # Get all the attributes from request.state
7983 state_dict = {}
@@ -83,20 +87,24 @@ async def test_middleware(request: Request) -> Dict[str, Any]:
8387 state_dict [key ] = getattr (request .state , key )
8488
8589 return {
86- "message" : "Middleware test - Auth required " ,
90+ "message" : "Authentication successful! User info from Firebase token: " ,
8791 "middleware_state" : state_dict ,
8892 "user_id" : getattr (request .state , "user_id" , None ),
89- "request_id" : getattr (request .state , "request_id" , None ),
93+ "user_email" : getattr (request .state , "user_email" , None ),
94+ "email_verified" : getattr (request .state , "email_verified" , None ),
9095 "user_claims" : getattr (request .state , "user_claims" , None ),
91- "headers" : dict (request .headers )
96+ "user_info" : getattr (request .state , "user_info" , None ),
97+ "request_id" : getattr (request .state , "request_id" , None ),
98+ "authorization_header" : request .headers .get ("Authorization" , "Not provided" )
9299 }
93100
94101
95102@app .get ("/test-middleware-public" )
96103async def test_middleware_public (request : Request ) -> Dict [str , Any ]:
97104 """
98105 Public test endpoint that shows middleware-added state.
99- This should work without authentication as it's in PUBLIC_PATHS.
106+ This endpoint is in PUBLIC_PATHS, so it works without authentication.
107+ No Firebase token is required to access this endpoint.
100108 """
101109 # Get all the attributes from request.state
102110 state_dict = {}
@@ -105,9 +113,93 @@ async def test_middleware_public(request: Request) -> Dict[str, Any]:
105113 if not key .startswith ("_" ) and not callable (getattr (request .state , key )):
106114 state_dict [key ] = getattr (request .state , key )
107115
116+ # Check if any auth header was provided (optional for this endpoint)
117+ auth_header = request .headers .get ("Authorization" )
118+ auth_message = "No authentication required for this endpoint"
119+ if auth_header :
120+ auth_message += " (but you provided an auth header anyway)"
121+
108122 return {
109- "message" : "Middleware test - Public" ,
123+ "message" : "Public endpoint - No authentication required" ,
124+ "auth_status" : auth_message ,
110125 "middleware_state" : state_dict ,
111126 "request_id" : getattr (request .state , "request_id" , None ),
112- "headers" : dict (request .headers )
127+ "authorization_header" : request .headers .get ("Authorization" , "Not provided" ),
128+ }
129+
130+
131+ # Role-based access test endpoints
132+ from .middleware .auth import has_roles
133+ from .schemas .user import UserRole
134+
135+ @app .get ("/test-role-admin" )
136+ async def test_role_admin (
137+ request : Request ,
138+ authorized : bool = has_roles ([UserRole .ADMIN ])
139+ ) -> Dict [str , Any ]:
140+ """
141+ Test endpoint that requires the Admin role.
142+
143+ This demonstrates role-based access control using the has_roles dependency.
144+ Only users with the Admin role can access this endpoint.
145+ """
146+ return {
147+ "message" : "You have successfully accessed an admin-only endpoint" ,
148+ "user_id" : request .state .user_id ,
149+ "user_email" : request .state .user_email ,
150+ "role" : "admin"
151+ }
152+
153+ @app .get ("/test-role-volunteer" )
154+ async def test_role_volunteer (
155+ request : Request ,
156+ authorized : bool = has_roles ([UserRole .VOLUNTEER ])
157+ ) -> Dict [str , Any ]:
158+ """
159+ Test endpoint that requires the Volunteer role.
160+
161+ This demonstrates role-based access control using the has_roles dependency.
162+ Only users with the Volunteer role can access this endpoint.
163+ """
164+ return {
165+ "message" : "You have successfully accessed a volunteer-only endpoint" ,
166+ "user_id" : request .state .user_id ,
167+ "user_email" : request .state .user_email ,
168+ "role" : "volunteer"
169+ }
170+
171+ @app .get ("/test-role-participant" )
172+ async def test_role_participant (
173+ request : Request ,
174+ authorized : bool = has_roles ([UserRole .PARTICIPANT ])
175+ ) -> Dict [str , Any ]:
176+ """
177+ Test endpoint that requires the Participant role.
178+
179+ This demonstrates role-based access control using the has_roles dependency.
180+ Only users with the Participant role can access this endpoint.
181+ """
182+ return {
183+ "message" : "You have successfully accessed a participant-only endpoint" ,
184+ "user_id" : request .state .user_id ,
185+ "user_email" : request .state .user_email ,
186+ "role" : "participant"
187+ }
188+
189+ @app .get ("/test-role-multiple" )
190+ async def test_role_multiple (
191+ request : Request ,
192+ authorized : bool = has_roles ([UserRole .ADMIN , UserRole .VOLUNTEER ])
193+ ) -> Dict [str , Any ]:
194+ """
195+ Test endpoint that requires either Admin OR Volunteer role.
196+
197+ This demonstrates role-based access control with multiple allowed roles.
198+ Users with either Admin or Volunteer roles can access this endpoint.
199+ """
200+ return {
201+ "message" : "You have successfully accessed an endpoint requiring admin OR volunteer role" ,
202+ "user_id" : request .state .user_id ,
203+ "user_email" : request .state .user_email ,
204+ "roles_allowed" : ["admin" , "volunteer" ]
113205 }
0 commit comments