Как отправить OTP в django через sms или электронную почту

Мне нужна помощь в отправке и проверке OTP в Django. Я пытаюсь добавить 2FA в мой модуль аутентификации и наткнулся на пакет pyotp, который помогает генерировать и проверять OTP. Хорошо то, что я могу использовать этот пакет для генерации OTP, но моя проблема в том, как проверить этот OTP, если он просрочен или неверен, когда я прошу пользователя отправить OTP на его телефон или почту. Я могу проверить вручную, но это не скажет мне, истек срок действия OTP или нет, и я также не знаю, как истекает срок действия OTP после определенного времени

ДЛЯ СОЗДАНИЯ OTP

import pyotp
 base32secret3232 = pyotp.random_base32()
 otp = pyotp.TOTP(base32secret3232)
 time_otp = otp.now() 
 user.otp = time_otp
 user.save()

ДЛЯ ПРОВЕРКИ OTP

  if totp.verify(otp):
    user.is_verified = True
    user.save()

после долгих исследований я смог это исправить. приведенный ниже код сгенерирует otp

1. import pyotp
2. base32secret3232 = pyotp.random_base32()
3. otp = pyotp.TOTP(base32secret3232, interval=60, digits=5)
4. time_otp = otp.now() 
5. user.otp = time_otp
6. user.otp_secret = base32secret3232
7. user.save()
8. send the otp to the user's email or phone

строка 1 импортирует пакет после pip install строка 2 генерирует секретный ключ, в строке 3 указывается время действия (сек) и количество цифр, которое должно быть у ОТП строка 4 генерирует OTP из секретного ключа, используя текущее время. Строки 5 и 6 сохраняют сгенерированный секретный ключ и otp в базу данных, хотя вы можете не сохранять otp

приведенный ниже код проверяет otp

1 otp = request.GET.get('otp')
2 user_id = request.GET.get('id')

3        try:
4            user = User.objects.get(otp = otp, id = user_id)
5            if  pyotp.TOTP(user.otp_secrete, interval=60, digits=5).verify(otp):
6                user.is_verified = True
7                user.save()
8                return Response({'email':'Successully activated'},  
status=status.HTTP_200_OK)
9            else:
                return Response({'email':'Activations OTP expired or Invalid OTP'}, status=status.HTTP_400_BAD_REQUEST)
        except:
            return Response({'error': ' something went wrong'}, status=status.HTTP_400_BAD_REQUEST)

строки 1 и 2 получают otp от пользователя, а также user_id строка 4 запрашивает базу данных с указанными выше данными, если пользователь доступен строка 5 проверяет полученный otp, используя сохраненный секретный ключ. ПРИМЕЧАНИЕ: убедитесь, что интервал=60, цифры=5, используемые при генерации otp, совпадают с теми, которые используются при проверке otp, иначе он не будет работать. спасибо и надеюсь, что это поможет кому-нибудь

Вернуться на верх