# ===================== Importing FastAPI necessary packages ============= from fastapi import ( FastAPI, HTTPException, status, Request, ) from fastapi.staticfiles import StaticFiles from src.dependecies import authenticate_user from src.routers.routers import router from src.routers.post import post from src.routers.history_find import history_find from src.routers.post_save import post_save from src.routers.history import history import base64 import binascii from fastapi.middleware.cors import CORSMiddleware # ------------------ FastAPI variable ---------------------------------- app = FastAPI() app.mount("/post", StaticFiles(directory="post"), name="post") origins = ["*"] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # ================ Authentication Middleware ======================= # ----------- Here authentication is based on basic scheme, # ----------- another authentication, based on bearer scheme, is used throughout # ---------- the application (as decribed in FastAPI oficial documentation) @app.middleware("http") async def authenticate(request: Request, call_next): # -------------------- Authentication basic scheme ----------------------------- if "Authorization" in request.headers: auth = request.headers["Authorization"] try: scheme, credentials = auth.split() if scheme.lower() == 'basic': decoded = base64.b64decode(credentials).decode("ascii") username, _, password = decoded.partition(":") request.state.user = await authenticate_user(username, password) except (ValueError, UnicodeDecodeError, binascii.Error): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid basic auth credentials" ) response = await call_next(request) return response # ================= Routers inclusion from src directory =============== app.include_router(post) app.include_router(router) app.include_router(history_find) app.include_router(post_save) app.include_router(history)