Skip to content

Commit af660ab

Browse files
committed
Speed up http2kafka
1 parent f16c971 commit af660ab

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

data_rentgen/server/providers/auth/personal_token_provider.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
from cachetools import LRUCache, TTLCache
1010
from fastapi import Depends, FastAPI, Request
1111

12+
from data_rentgen.db.factory import AsyncSession
1213
from data_rentgen.db.models import PersonalToken, User
1314
from data_rentgen.dependencies import Stub
1415
from data_rentgen.exceptions.auth import AuthorizationError
1516
from data_rentgen.exceptions.entity import EntityNotFoundError
1617
from data_rentgen.server.services.personal_token import PersonalTokenService
1718
from data_rentgen.server.settings.auth.personal_token import PersonalTokenSettings
1819
from data_rentgen.server.utils.jwt import decode_jwt, sign_jwt
20+
from data_rentgen.services.uow import UnitOfWork
1921
from data_rentgen.utils.uuid import extract_timestamp_from_uuid
2022

2123
logger = 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

Comments
 (0)