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