Я создаю API для аутентификации пользователя с двухфакторной аутентификацией при входе в систему.
Следующее представление перенаправляется после успешного входа в систему.
class TOTPView(APIView):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.verified = False
self.last_verified_counter = -1
self.totp = self.generate_totp()
def get(self, request, *args, **kwargs):
logger.debug(self.totp)
return Response({'success': True},
status=status.HTTP_201_CREATED)
def post(self, request):
token = int(request.data.get('totp_token'))
# check if the current counter value is higher than the value of
# last verified counter and check if entered token is correct by
# calling totp.verify_token()
if ((self.totp.t() > self.last_verified_counter) and
(self.totp.verify(token))):
# if the condition is true, set the last verified counter value
# to current counter value, and return True
self.last_verified_counter = self.totp.t()
self.verified = True
return Response({'success': True},
status=status.HTTP_404_NOT_FOUND)
else:
# if the token entered was invalid or if the counter value
# was less than last verified counter, then return False
self.verified = False
return Response(status=status.HTTP_404_NOT_FOUND)
def generate_totp(self):
key = random_hex(20)
totp = TOTP(key)
totp.time = time.time()
return totp
Здесь, когда пользователь отправляет OTP-код / токен, метод POST вызывает self.totp
, и это перезаписывает его значение путем вызова self.generate_totp()
снова. Это никогда не проверяет TOTP. Я что-то здесь не так делаю?