99from cachetools import LRUCache , TTLCache
1010from fastapi import Depends , FastAPI , Request
1111
12+ from data_rentgen .db .factory import AsyncSession
1213from data_rentgen .db .models import PersonalToken , User
1314from data_rentgen .dependencies import Stub
1415from data_rentgen .exceptions .auth import AuthorizationError
1516from data_rentgen .exceptions .entity import EntityNotFoundError
1617from data_rentgen .server .services .personal_token import PersonalTokenService
1718from data_rentgen .server .settings .auth .personal_token import PersonalTokenSettings
1819from data_rentgen .server .utils .jwt import decode_jwt , sign_jwt
20+ from data_rentgen .services .uow import UnitOfWork
1921from data_rentgen .utils .uuid import extract_timestamp_from_uuid
2022
2123logger = logging .getLogger (__name__ )
@@ -55,11 +57,9 @@ def __init__(
5557 self ,
5658 settings : Annotated [PersonalTokenSettings , Depends (Stub (PersonalTokenSettings ))],
5759 token_cache : Annotated [PersonalTokenCache , Depends (Stub (PersonalTokenCache ))],
58- personal_token_service : Annotated [PersonalTokenService , Depends ()],
5960 ) -> None :
6061 self ._settings = settings
6162 self ._token_cache = token_cache
62- self ._personal_token_service = personal_token_service
6363
6464 @classmethod
6565 def setup (cls , app : FastAPI ) -> FastAPI :
@@ -145,7 +145,7 @@ async def get_current_user(self, access_token: str | None, request: Request) ->
145145 raise AuthorizationError (msg )
146146
147147 user , token = self .extract_token (access_token )
148- is_revoked = await self .check_token_revoked (user , token )
148+ is_revoked = await self .check_token_revoked (user , token , request )
149149 if is_revoked :
150150 details = f"PersonalToken name='{ token .name } ', id={ token .id } is revoked"
151151 msg = "Invalid token"
@@ -162,24 +162,34 @@ async def get_optional_user(self, access_token: str | None, request: Request) ->
162162 raise AuthorizationError (msg )
163163
164164 user , token = self .extract_token (access_token )
165- is_revoked = await self .check_token_revoked (user , token )
165+ is_revoked = await self .check_token_revoked (user , token , request )
166166 if is_revoked :
167167 details = f"PersonalToken name='{ token .name } ', id={ token .id } is revoked"
168168 msg = "Invalid token"
169169 raise AuthorizationError (msg , details )
170170 logger .debug ("Got user %r from token %r" , user , token )
171171 return user
172172
173- async def check_token_revoked (self , user : User , token : PersonalToken ) -> bool :
173+ async def check_token_revoked (self , user : User , token : PersonalToken , request : Request ) -> bool :
174174 is_revoked = self ._token_cache .is_revoked (token .id )
175175 if is_revoked is not None :
176176 return is_revoked
177177
178- try :
179- await self ._personal_token_service .get (user , token .id )
180- is_revoked = False
181- except EntityNotFoundError :
182- is_revoked = True
178+ is_revoked = False
179+
180+ # checking session in cache is fast, creating new session is slow,
181+ # let's postpone it using a hack
182+ session_generator = request .app .dependency_overrides [AsyncSession ]
183+ async for session in session_generator ():
184+ personal_token_service = PersonalTokenService (
185+ uow = UnitOfWork (session ),
186+ settings = self ._settings ,
187+ )
188+ try :
189+ await personal_token_service .get (user , token .id )
190+ is_revoked = False
191+ except EntityNotFoundError :
192+ is_revoked = True
183193
184194 if is_revoked :
185195 self ._token_cache .revoke_token (token .id )
0 commit comments