Skip to content

Commit 17778d9

Browse files
committed
1) Рефакторинг.
2) Авторизация через телеграм.
1 parent f5280f6 commit 17778d9

File tree

8 files changed

+37
-41
lines changed

8 files changed

+37
-41
lines changed

app/api/deps.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
Dependencies
33
"""
44

5-
from fastapi import Depends, Header
5+
from fastapi import Depends
6+
from fastapi.security import HTTPAuthorizationCredentials
67
from typing_extensions import Annotated
78

89
from app import models
910
from app.core import exps, settings
1011
from app.core.db import Database, SessionLocal
11-
from app.core.security import JWTManager, TelegramAuth
12+
from app.core.security import JWTManager, oauth
1213

1314

1415
async def get_db() -> Database:
@@ -20,18 +21,18 @@ async def get_jwt_manager() -> JWTManager:
2021
return JWTManager(settings.APP_SECRET_KEY)
2122

2223

23-
async def get_telegram_auth() -> TelegramAuth:
24-
return TelegramAuth(
24+
async def get_oauth_telegram() -> oauth.Telegram:
25+
return oauth.Telegram(
2526
settings.TELEGRAM_BOT_TOKEN, settings.TELEGRAM_BOT_USERNAME
2627
)
2728

2829

2930
async def get_current_user(
30-
access_token: Annotated[str, Header()],
31-
db: Annotated[Database, Depends(get_db)],
32-
jwt_manager: Annotated[JWTManager, Depends(get_jwt_manager)],
31+
credentials: Annotated[HTTPAuthorizationCredentials, oauth.oauth],
32+
jwt_manager: Annotated[JWTManager, Depends(get_jwt_manager)],
33+
db: Annotated[Database, Depends(get_db)],
3334
) -> models.User:
34-
payload = jwt_manager.decode_token(access_token)
35+
payload = jwt_manager.decode_token(credentials.credentials)
3536
if payload.get('type') != 'access':
3637
raise exps.TOKEN_INVALID
3738
if not (user := await db.user.read(payload.get('id'))):

app/api/endpoints/tokens/auth.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,24 @@
99
from app.api import deps
1010
from app.core import exps
1111
from app.core.db import Database
12-
from app.core.security import JWTManager, TelegramAuth
12+
from app.core.security import JWTManager, oauth
1313

1414
router = APIRouter(prefix='/auth')
1515

1616

1717
@router.post('/telegram/', response_model=models.AuthToken)
1818
async def telegram(
19-
user: models.UserCreate,
20-
db: Annotated[Database, Depends(deps.get_db)],
21-
auth: Annotated[TelegramAuth, Depends(deps.get_telegram_auth)],
22-
jwt_manager: Annotated[JWTManager, Depends(deps.get_jwt_manager)],
19+
user: models.UserCreate,
20+
db: Annotated[Database, Depends(deps.get_db)],
21+
jwt_manager: Annotated[JWTManager, Depends(deps.get_jwt_manager)],
22+
oauth_telegram: Annotated[oauth, Depends(deps.get_oauth_telegram)],
2323
):
2424
"""
2525
Get auth token
2626
"""
2727
user_dict = user.model_dump()
28-
computed_hash = auth.generate_hash(user_dict)
29-
if not auth.is_correct(computed_hash, user.hash):
28+
computed_hash = oauth_telegram.generate_hash(user_dict)
29+
if not oauth_telegram.is_correct(computed_hash, user.hash):
3030
raise exps.USER_IS_CORRECT
3131

3232
model_user = models.User(**user.model_dump())
@@ -35,7 +35,7 @@ async def telegram(
3535
else:
3636
await db.user.create(model_user)
3737
await db.session.commit()
38-
token = models.AuthToken(token=jwt_manager.encode_token(
39-
{'id': user.id, 'type': 'auth'},15
40-
))
38+
token = models.AuthToken(
39+
token=jwt_manager.encode_token({'id': user.id, 'type': 'auth'}, 15)
40+
)
4141
return token

app/api/endpoints/tokens/pair.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,12 @@ async def new_pair_tokens(
2222
if payload.get('type') != 'auth':
2323
raise exps.TOKEN_INVALID
2424
payload['type'] = 'access'
25-
access_token = models.AccessToken(token=jwt_manager.encode_token(payload, 120))
25+
access_token = models.AccessToken(
26+
token=jwt_manager.encode_token(payload, 120)
27+
)
2628
payload['type'] = 'refresh'
27-
refresh_token = models.RefreshToken(token=jwt_manager.encode_token(payload, 1440))
29+
refresh_token = models.RefreshToken(
30+
token=jwt_manager.encode_token(payload, 1440)
31+
)
2832
tokens = models.PairTokens(access=access_token, refresh=refresh_token)
2933
return tokens

app/core/security/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .auth import TelegramAuth
1+
from . import oauth
22
from .jwt_manager import JWTManager
33

4-
__all__ = ['JWTManager', 'TelegramAuth']
4+
__all__ = ['JWTManager', 'oauth']

app/core/security/auth/__init__.py

Lines changed: 0 additions & 3 deletions
This file was deleted.

app/core/security/jwt_manager/jwt_manager.py renamed to app/core/security/jwt_manager.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,10 @@ def decode_token(self, token: str) -> dict:
2424

2525
return payload
2626

27-
def encode_token(self, payload: dict, minutes: int | None = None) -> str:
28-
claims = {'payload': payload}
29-
if minutes:
30-
claims['exp'] = dt.datetime.now(dt.UTC) + dt.timedelta(
31-
minutes=minutes
32-
)
27+
def encode_token(self, payload: dict, minutes: int) -> str:
28+
claims = {
29+
'payload': payload,
30+
'exp': dt.datetime.now(dt.UTC) + dt.timedelta(minutes=minutes)
31+
}
3332
token = jwt.encode(claims, self.secret_key, algorithm=ALGORITHMS.HS256)
3433
return token

app/core/security/jwt_manager/__init__.py

Lines changed: 0 additions & 3 deletions
This file was deleted.

app/core/security/auth/telegram.py renamed to app/core/security/oauth.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import hashlib
22
import hmac
33

4-
from app.core import settings
4+
from fastapi.security import HTTPBearer
55

6+
oauth = HTTPBearer()
67

7-
class TelegramAuth:
8-
def __init__(
9-
self,
10-
token: str = settings.TELEGRAM_BOT_TOKEN,
11-
username: str = settings.TELEGRAM_BOT_USERNAME,
12-
):
8+
9+
class Telegram:
10+
def __init__(self, token: str, username: str):
1311
self.token = token
1412
self.username = username
1513

0 commit comments

Comments
 (0)