Coverage for app/core/security.py: 100%

18 statements  

« prev     ^ index     » next       coverage.py v7.16.1, created at 2026-10-26 10:48 +0000

1from datetime import UTC, datetime, timedelta 

2from typing import Any 

3 

4import jwt 

5from pwdlib import PasswordHash 

6from pwdlib.hashers.argon2 import Argon2Hasher 

7from pwdlib.hashers.bcrypt import BcryptHasher 

8 

9from app.core.config import settings 

10 

11password_hash = PasswordHash( 

12 ( 

13 Argon2Hasher(), 

14 BcryptHasher(), 

15 ) 

16) 

17 

18 

19ALGORITHM = "HS256" 

20 

21 

22def create_access_token(subject: str | Any, expires_delta: timedelta) -> str: 

23 expire = datetime.now(UTC) + expires_delta 1afbgcde

24 to_encode = {"exp": expire, "sub": str(subject)} 1afbgcde

25 encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=ALGORITHM) 1afbgcde

26 return encoded_jwt 1afbgcde

27 

28 

29def verify_password( 

30 plain_password: str, hashed_password: str 

31) -> tuple[bool, str | None]: 

32 return password_hash.verify_and_update(plain_password, hashed_password) 1aflbgcdehimnjopk

33 

34 

35def get_password_hash(password: str) -> str: 

36 return password_hash.hash(password) 1aqrstuvwbcxyzdABCeDhEiFGHjIJKLMNk