Как отправить 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, иначе он не будет работать. спасибо и надеюсь, что это поможет кому-нибудь