Add logging out

This commit is contained in:
kittentm 2026-02-11 04:46:12 +01:00
commit b131e78e90
2 changed files with 50 additions and 0 deletions

View file

@ -4,6 +4,7 @@ from config import settings
import uvicorn import uvicorn
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from database import init_db from database import init_db
from routes import logout
app = FastAPI() app = FastAPI()
@ -27,6 +28,7 @@ async def force_cors_on_errors(request: Request, call_next):
app.include_router(sso.router, prefix="/api/v2/sso") app.include_router(sso.router, prefix="/api/v2/sso")
app.include_router(user.router, prefix="/api/v1/users") app.include_router(user.router, prefix="/api/v1/users")
app.include_router(logout.router, prefix="/api/v1")
if __name__ == '__main__': if __name__ == '__main__':
uvicorn.run("main:app", host="0.0.0.0", port=settings.port, reload=True) uvicorn.run("main:app", host="0.0.0.0", port=settings.port, reload=True)

48
routes/logout.py Normal file
View file

@ -0,0 +1,48 @@
from fastapi import APIRouter, Request, Form, Response, Depends
from fastapi.responses import RedirectResponse
from sqlalchemy.orm import Session as DBSession
from database import SessionLocal, User, Session
from config import settings, cipher
from services import auth
from typing import Optional
import uuid
router = APIRouter()
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@router.post('/spfn/logout')
async def logout(
request: Request,
frontend_origin: Optional[str] = Form(None),
db: DBSession = Depends(get_db)
):
host = (frontend_origin or request.headers.get("referer") or "/").rstrip('/')
redirect_url = f"{host}/sign_in/"
response = RedirectResponse(url=redirect_url, status_code=303)
session_id = request.cookies.get("session_id")
if session_id:
try:
db.query(Session).filter(Session.id == session_id).delete()
db.commit()
print(f"Session {session_id} deleted from database.")
except Exception as e:
print(f"Error deleting session: {e}")
db.rollback()
response.delete_cookie(
key="session_id",
path="/",
domain=None,
httponly=settings.cookie_httponly,
samesite="lax"
)
return response