mfa.py
1 import hashlib 2 3 from pyotp import TOTP 4 5 from ..redis import redis 6 from ..settings import settings 7 8 9 async def check_mfa_code(code: str, secret: str) -> bool: 10 if await redis.exists(key := f"mfa_block:{hashlib.sha256(secret.encode()).hexdigest()}:{code}"): 11 return False 12 13 if not TOTP(secret).verify(code, valid_window=settings.mfa_valid_window): 14 return False 15 16 await redis.setex(key, 30 * (2 * settings.mfa_valid_window + 2), 1) 17 return True