44 lines
No EOL
1.4 KiB
Python
44 lines
No EOL
1.4 KiB
Python
from starlette.requests import Request
|
|
from starlette.responses import JSONResponse
|
|
from typing import Optional
|
|
from session_manager import User
|
|
|
|
|
|
def get_current_user(request: Request, session_manager) -> Optional[User]:
|
|
"""Extract current user from request cookies"""
|
|
auth_token = request.cookies.get("auth_token")
|
|
if not auth_token:
|
|
return None
|
|
|
|
return session_manager.get_user_from_token(auth_token)
|
|
|
|
|
|
def require_auth(session_manager):
|
|
"""Decorator to require authentication for endpoints"""
|
|
def decorator(handler):
|
|
async def wrapper(request: Request):
|
|
user = get_current_user(request, session_manager)
|
|
if not user:
|
|
return JSONResponse(
|
|
{"error": "Authentication required"},
|
|
status_code=401
|
|
)
|
|
|
|
# Add user to request state so handlers can access it
|
|
request.state.user = user
|
|
return await handler(request)
|
|
|
|
return wrapper
|
|
return decorator
|
|
|
|
|
|
def optional_auth(session_manager):
|
|
"""Decorator to optionally extract user for endpoints"""
|
|
def decorator(handler):
|
|
async def wrapper(request: Request):
|
|
user = get_current_user(request, session_manager)
|
|
request.state.user = user # Can be None
|
|
return await handler(request)
|
|
|
|
return wrapper
|
|
return decorator |