Конечные точки для двухфакторной аутентификации с использованием Django REST - PullRequest
0 голосов
/ 13 февраля 2020

Я создаю 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. Я что-то здесь не так делаю?

1 Ответ

1 голос
/ 14 февраля 2020

Я думаю, проблема в том, что вы каждый раз генерируете новый ключ для своего TOTP. Вместо этого вы должны сохранить ключ против пользователя, который входит в систему, чтобы вы всегда проверяли по одному и тому же ключу. Я предполагаю, что вы каким-то образом даете ключ пользователю (с помощью QR-кода?), Чтобы он мог добавить его в приложение аутентификатора и сгенерировать токены.

Еще одна вещь, я заметил, что вы применяете токен к целое число Токены должны быть строками, так как они могут содержать начальные нули, которые вы потеряете, приведя к целому числу.

...