1- import hashlib
21import hmac
3- from datetime import datetime , timedelta
4- from typing import TypedDict
2+ import hashlib
53from uuid import uuid4
4+ from typing import TypedDict
5+ from datetime import datetime , timedelta
66
7- import bcrypt
87import jwt
9- from django . utils import timezone
8+ import bcrypt
109from faker import Faker
10+ from django .utils import timezone
1111from ninja .errors import AuthenticationError
1212
13- from src .api .enums .CharacterCasing import CharacterCasing
14- from src .api .models .postgres import User
15- from src .api .typing .ExpireUUID import ExpireUUID
1613from src .env import jwt_config
17- from src .utils .logger import Logger
1814from src .utils .svcs import Service
15+ from src .utils .logger import Logger
16+ from src .api .models .postgres import User
17+ from src .api .typing .ExpireUUID import ExpireUUID
18+ from src .api .enums .CharacterCasing import CharacterCasing
1919
2020DEFAULT_CHARACTER_LENGTH = 12
2121fake = Faker ()
2222
23+
2324class SignatureData (TypedDict ):
2425 title : str
2526 signature : str
2627 timestamp : str
2728 key : str
2829 ttl : int | float
2930
31+
3032@Service ()
3133class UtilityService :
3234 @staticmethod
@@ -91,25 +93,22 @@ def generate_uuid() -> ExpireUUID:
9193 lifespan = timedelta (hours = 24 )
9294 expires_at = current_time + lifespan
9395 return {"uuid" : uuid4 (), "expires_at" : expires_at }
94-
96+
9597 @staticmethod
9698 def generate_signature (key : str , timestamp : str ) -> str :
9799 signature = hmac .new (
98100 key = key .encode (), msg = timestamp .encode (), digestmod = hashlib .sha256
99101 ).hexdigest ()
100102 return signature
101103
102-
103104 @staticmethod
104105 def verify_signature (signature_data : SignatureData , logger : Logger ) -> bool :
105-
106106 signature = signature_data ["signature" ]
107107 timestamp = signature_data ["timestamp" ]
108108 key = signature_data ["key" ]
109109 ttl = signature_data ["ttl" ]
110110 title = signature_data ["title" ]
111111
112-
113112 valid_signature = UtilityService .generate_signature (key , timestamp )
114113 is_valid = hmac .compare_digest (valid_signature , signature )
115114
@@ -124,9 +123,9 @@ def verify_signature(signature_data: SignatureData, logger: Logger) -> bool:
124123 )
125124 raise AuthenticationError (message = message )
126125
127- initial_time = datetime .fromtimestamp (float (timestamp )/ 1000 )
126+ initial_time = datetime .fromtimestamp (float (timestamp ) / 1000 )
128127 valid_window = initial_time + timedelta (minutes = ttl )
129-
128+
130129 if valid_window < datetime .now ():
131130 message = "Signature expired!"
132131 logger .error (
@@ -140,8 +139,7 @@ def verify_signature(signature_data: SignatureData, logger: Logger) -> bool:
140139
141140 return True
142141
143-
144142 @staticmethod
145143 def get_timestamp () -> str :
146144 current_time = datetime .now ().timestamp () * 1000
147- return str (current_time )
145+ return str (current_time )
0 commit comments