Pyotp показывает ошибку otp с истекшим сроком действия, даже если срок ее действия еще не истекPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Pyotp показывает ошибку otp с истекшим сроком действия, даже если срок ее действия еще не истек

Сообщение Anonymous »

Я использую эту библиотеку для сброса пароля пользователя. Это блок кода, который генерирует код:

Код: Выделить всё

async def create_code(db: AsyncSession, user):
secret_key = pyotp.random_base32()

totp = pyotp.TOTP(secret_key, interval=settings.verification_code_expire_time)
verification_code = totp.now()

if not user.code:
user.code = VerificationCode(code=verification_code, secret_key=secret_key)
else:
user.code.code = verification_code
user.code.secret_key = secret_key

await db.commit()
return verification_code
У меня есть две конечные точки для отправки кода подтверждения на электронную почту, а другая — для сброса пароля пользователя. Вот реализация обоих методов:
Метод отправки кода подтверждения:

Код: Выделить всё

async def send_verification_code(email: EmailStr, db: AsyncSession):
user = await find_user_by_email_one_or_none(db=db, email=email)
if not user:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found")

if not user.verified:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Email not verified")

verification_code = await create_code(db, user)

body = f"This is your verification code {verification_code} to reset the password."
email_sender = EmailSender(receiver_email=user.email, subject="Password Reset", body=body)
await email_sender.send()

return {"detail": "Verification code has been sent to your email."}
Метод сброса пароля:

Код: Выделить всё

async def reset_password(reset_password_schema: PasswordResetSchema, db: AsyncSession):
query = select(VerificationCode).where(VerificationCode.code == reset_password_schema.verification_code)
result = await db.execute(query)
verification_code = result.scalar_one_or_none()

if not verification_code:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid verification code.")

totp = pyotp.TOTP(verification_code.secret_key, interval=settings.verification_code_expire_time)

if not totp.verify(reset_password_schema.verification_code):
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Verification code has been expired.")

query = update(User).where(User.id == verification_code.user_id).values(password=reset_password_schema.new_password)
await db.execute(query)

user = await find_user_by_id(db, verification_code.user_id)
if user.first_login:
user.first_login = False

query = delete(VerificationCode).where(VerificationCode.code == reset_password_schema.verification_code)
await db.execute(query)

await db.commit()

return {"detail": "Password has been reset successfully."}
Код работает нормально, но иногда появляется ошибка «Срок действия кода проверки истек», даже если срок действия кода еще не истек. Я попытался отследить ошибку, но согласно документации библиотеки реализация кажется нормальной. Я не мог выяснить настоящую причину этого. Кто-нибудь когда-нибудь сталкивался с этой проблемой? или я упускаю что-то важное в этой реализации?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ot-expired
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»