From 4848a9e9394b283022085a6305d00f94b11cd703 Mon Sep 17 00:00:00 2001 From: l3wdfut4pwr Date: Mon, 27 Apr 2026 13:45:09 +0300 Subject: add username change and logout --- app/auth/dependencies.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 app/auth/dependencies.py (limited to 'app/auth/dependencies.py') diff --git a/app/auth/dependencies.py b/app/auth/dependencies.py new file mode 100644 index 0000000..f482a50 --- /dev/null +++ b/app/auth/dependencies.py @@ -0,0 +1,48 @@ +from fastapi import Depends, HTTPException, Request, status +from sqlalchemy.ext.asyncio import AsyncSession + +from app.auth.jwt import JWTClaims, decode_token +from app.models.user import User +from app.utils.db import get_async_session + + +async def get_optional_user( + request: Request, + session: AsyncSession = Depends(get_async_session), +) -> User | None: + token = request.cookies.get("access_token") + if not token: + return None + + try: + payload: JWTClaims = decode_token(token) + except Exception: + return None + + sub = payload["sub"] + token_version = payload["token_version"] + + if not sub.isdigit(): + return None + + user_id = int(sub) + + user = await User.get_user_by_id(user_id, session=session) + if not user: + return None + + if user.token_version != token_version: + return None + + return user + + +async def get_current_user( + user: User | None = Depends(get_optional_user), +) -> User: + if user is None: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Not authenticated", + ) + return user -- cgit v1.3-3-g829e