С помощью этого руководства настройте и запустите систему проверки одноразовых паролей в своем приложении Python.

Даже если ваш пароль будет украден, системы проверки OTP служат решающим фактором безопасности. Это устраняет необходимость запоминать пароли, служит дополнительным уровнем безопасности и снижает риск фишинга.

Научитесь создавать систему проверки OTP с помощью Python, которая отправляет вам OTP на номер вашего мобильного телефона. действителен только в течение двух минут, и ваша учетная запись будет заблокирована, если вы введете неправильный OTP три раза за один раз. ряд.

Установите модули Tkinter, Twilio и Random.

Tkinter позволяет вам создавать настольные приложения. Он предлагает множество виджетов, таких как кнопки, метки и текстовые поля, которые упрощают разработку приложений.

Модуль Twilio поможет вам интегрировать коммуникационные функции, такие как SMS, MMS, телефонные звонки и подтверждение прямо в вашем приложении. Он имеет облачную инфраструктуру, а также удивительные функции, такие как выделение номеров, шаблоны сообщений и запись звонков.

instagram viewer

Чтобы установить модули Twilio и Tkinter, выполните в терминале следующую команду:

pip install twilio tk

Модуль Random — это встроенный модуль Python, используемый для генерации псевдослучайных чисел. При этом вы можете генерировать случайные числа, выбирать случайные элементы из списка, перемешивать содержимое списка и многое другое. Вы можете использовать его для моделирования броска кубика, тасования списков или генератор случайных паролей.

Создайте Twilio API и получите номер телефона

Чтобы использовать Twilio и отправлять запросы OTP на свой мобильный телефон, вам потребуются учетные данные для аутентификации и номер телефона Twilio. Для достижения этой цели:

  1. Зарегистрируйте учетную запись Twilio и посетите Консоль Twilio.
  2. Прокрутите вниз и нажмите на Получить номер телефона кнопка. Скопируйте сгенерированный номер телефона.
  3. Прокрутите вниз до Информация об аккаунте раздел. Скопируйте SID учетной записи и Токен авторизации.

Построение структуры приложения

Вы можете найти весь исходный код для создания системы проверки OTP с использованием Python в этом Репозиторий GitHub.

Импортируйте необходимые модули и установите учетные данные для аутентификации. Инициализируйте клиент Twilio для аутентификации и использования его в качестве точки входа для вызовов API. Установите время экспирации на две минуты.

определить класс, ОТППроверка, и инициализируйте конструктор, чтобы установить значения переменных по умолчанию вместе с инициализацией корневого окна и установкой заголовка и размеров приложения.

import tkinter as tk
from tkinter import messagebox
from twilio.rest import Client
import random
import threading
import time

account_sid = "YOUR_ACCOUNT_SID"
auth_token = "YOUR_AUTH_TOKEN"
client = Client(account_sid, auth_token)
expiration_time = 120

classOTPVerification:
def__init__(self, master):
self.master = master
self.master.title('OTP Verification')
self.master.geometry("600x275")
self.otp = None
self.timer_thread = None
self.resend_timer = None
self.wrong_attempts = 0
self.locked = False
self.stop_timer = False

Определите три метки, чтобы запрашивать номер мобильного телефона и одноразовый пароль, а также отображать таймер после того, как программа отправит одноразовый пароль. Установите родительский элемент, текст, который он должен отображать, и стили шрифта, которыми он должен обладать. Точно так же создайте два виджета ввода, чтобы получать ввод от пользователя. Установите его родительский элемент, его ширину и стили шрифта.

Создайте три кнопки для отправки OTP, повторной отправки OTP и подтверждения OTP. Установите его родительский элемент, текст, который он должен отображать, команду, которую он должен выполнять при нажатии, и его стили шрифта. Организуйте эти элементы с помощью пакет метод.

 self.label1 = tk.Label(self.master, 
text='Enter your mobile number:',
font=('Arial', 14))
self.label1.pack()

self.mobile_number_entry = tk.Entry(self.master,
width=20,
font=('Arial', 14))
self.mobile_number_entry.pack()

self.send_otp_button = tk.Button(self.master,
text='Send OTP',
command=self.send_otp,
font=('Arial', 14))
self.send_otp_button.pack()

self.timer_label = tk.Label(self.master,
text='',
font=('Arial', 12, 'bold'))
self.timer_label.pack()

self.resend_otp_button = tk.Button(self.master,
text='Resend OTP',
state=tk.DISABLED,
command=self.resend_otp,
font=('Arial', 14))
self.resend_otp_button.pack()

self.label2 = tk.Label(self.master,
text='Enter OTP sent to your mobile:',
font=('Arial', 14))
self.label2.pack()

self.otp_entry = tk.Entry(self.master,
width=20,
font=('Arial', 14))
self.otp_entry.pack()

self.verify_otp_button = tk.Button(self.master,
text='Verify OTP',
command=self.verify_otp,
font=('Arial', 14))
self.verify_otp_button.pack()

Построение функциональности приложения

Определите метод, start_timer() который работает timer_countdown в отдельной ветке.

defstart_timer(self):
self.timer_thread = threading.Thread(target=self.timer_countdown)
self.timer_thread.start()

Определите метод, timer_countdown(). Запишите время начала и запустите бесконечный цикл, который берет текущее время и вычисляет прошедшее и оставшееся время. Если стоп_таймер верно, завершить цикл. Если оставшееся время меньше или равно нулю, отобразите окно сообщения об ошибке, в котором говорится, что срок действия OTP истек.

Активируйте кнопку повторной отправки OTP, установите для OTP значение none и завершите работу. В противном случае подсчитайте оставшиеся минуты и секунды, отобразите их на метке таймера и засните на одну секунду.

deftimer_countdown(self):
start_time = time.time()
whileTrue:
current_time = time.time()
elapsed_time = current_time - start_time
remaining_time = expiration_time - elapsed_time
if self.stop_timer:
break
if remaining_time <= 0:
messagebox.showerror('Error', 'OTP has expired.')
self.resend_otp_button.config(state=tk.NORMAL)
self.otp = None
break
minutes = int(remaining_time // 60)
seconds = int(remaining_time % 60)
timer_label = f'Time Remaining: {minutes:02d}:{seconds:02d}'
self.timer_label.config(text=timer_label)
time.sleep(1)

Определите метод, send_otp(). Если заблокирован верно, вывести соответствующее сообщение. В противном случае извлеките номер телефона, подтвердите его и сгенерируйте случайный одноразовый пароль. Передайте мобильный телефон, который вы получили ранее, и используйте клиент, чтобы отправить OTP на ваш номер телефона. Отобразите окно сообщения, запустите таймер, отключите кнопки и полностью очистите запись.

defsend_otp(self):
if self.locked:
messagebox.showinfo('Account Locked', 'Your account is locked. Try again later.')
return
mobile_number = self.mobile_number_entry.get()
ifnot mobile_number:
messagebox.showerror('Error', 'Please enter your mobile number.')
return

self.otp = random.randint(1000, 9999)
message = client.messages.create(
body=f'Your OTP is {self.otp}.',
from_='TWILIO_MOBILE_NUMBER',
to=mobile_number
)
messagebox.showinfo('OTP Sent', f'OTP has been sent to {mobile_number}.')
self.start_timer()
self.send_otp_button.config(state=tk.DISABLED)
self.resend_otp_button.config(state=tk.DISABLED)
self.otp_entry.delete(0, tk.END)

Определите метод, resend_otp(). Если заблокировано, отобразите соответствующее сообщение. В противном случае получите номер телефона, подтвердите его, повторно создайте случайный одноразовый пароль, повторно отправьте одноразовый пароль, отобразите окно сообщения, запустите таймер и отключите кнопку повторной отправки одноразового пароля.

defresend_otp(self):
if self.locked:
messagebox.showinfo('Account Locked', 'Your account is locked. Try again later.')
return
mobile_number = self.mobile_number_entry.get()
ifnot mobile_number:
messagebox.showerror('Error', 'Please enter your mobile number.')
return

self.otp = random.randint(1000, 9999)
message = client.messages.create(
body=f'Your OTP is {self.otp}.',
from_='TWILIO_MOBILE_NUMBER',
to=mobile_number
)
messagebox.showinfo('OTP Sent', f'New OTP has been sent to {mobile_number}.')
self.start_timer()
self.resend_otp_button.config(state=tk.DISABLED)

Определите метод, Verify_otp(). Получите OTP и проверьте, не ввел ли пользователь что-либо. Если сохраненный OTP Никто, попросите пользователя сначала создать OTP. Если введенный пользователем одноразовый пароль совпадает с сохраненным, отобразите сообщение об успешной проверке одноразового пароля, остановите таймер и выйдите из программы. В противном случае проверьте наличие ошибочных попыток. Если количество неправильных попыток превышает три, заблокируйте учетную запись.

defverify_otp(self):
user_otp = self.otp_entry.get()
ifnot user_otp:
messagebox.showerror('Error', 'Please enter OTP.')
return
if self.otp isNone:
messagebox.showerror('Error', 'Please generate OTP first.')
return
if int(user_otp) == self.otp:
messagebox.showinfo('Success', 'OTP verified successfully.')
self.stop_timer = True
exit()
else:
self.wrong_attempts += 1
if self.wrong_attempts == 3:
self.lock_account()
else:
messagebox.showerror('Error', 'OTP does not match.')

Определите метод, lock_account(). Установите для заблокированного состояния значение true и отобразите метку как Аккаунт заблокирован. Отключите все ярлыки, записи и кнопки. Остановите существующий таймер и запустите новый на десять минут.

deflock_account(self):
self.locked = True
self.label1.config(text='Account Locked')
self.mobile_number_entry.config(state=tk.DISABLED)
self.send_otp_button.config(state=tk.DISABLED)
self.timer_label.config(text='')
self.resend_otp_button.config(state=tk.DISABLED)
self.label2.config(text='')
self.otp_entry.config(state=tk.DISABLED)
self.verify_otp_button.config(state=tk.DISABLED)
self.stop_timer = True
countdown_time = 10 * 60
self.start_countdown(countdown_time)

Определить метод start_countdown(). Если оставшееся время меньше или равно нулю, сбросить счет. В противном случае отобразите, что программа заблокировала учетную запись, и повторите попытку в оставшееся время с помощью обратного вызова.

defstart_countdown(self, remaining_time):
if remaining_time <= 0:
self.reset_account()
return

minutes = int(remaining_time // 60)
seconds = int(remaining_time % 60)
timer_label = f'Account Locked. Try again in: {minutes:02d}:{seconds:02d}'
self.timer_label.config(text=timer_label)
self.master.after(1000, self.start_countdown, remaining_time - 1)

Определите функцию, reset_account(). Сбросьте статус всех виджетов и переменных, как раньше.

defreset_account(self):
self.locked = False
self.wrong_attempts = 0
self.label1.config(text='Enter your mobile number:')
self.mobile_number_entry.config(state=tk.NORMAL)
self.send_otp_button.config(state=tk.NORMAL)
self.timer_label.config(text='')
self.resend_otp_button.config(state=tk.DISABLED)
self.label2.config(text='Enter OTP sent to your mobile:')
self.otp_entry.config(state=tk.NORMAL)
self.verify_otp_button.config(state=tk.NORMAL)
self.stop_timer = False

Создайте корневое окно, экземпляр класса и запустите приложение Tkinter.

if __name__ == '__main__':
root = tk.Tk()
otp_verification = OTPVerification(root)
root.mainloop()

Пример вывода проверки с использованием OTP

При запуске программы OTP Verification вы получаете окно с просьбой ввести номер своего мобильного телефона. Введите его вместе с кодом страны и нажмите кнопку Отправить одноразовый пароль кнопка. Вы получаете сообщение о том, что программа успешно отправила одноразовый пароль, и кнопка деактивируется на две минуты. Проверьте свой телефон на наличие OTP и введите его до истечения срока его действия.

При вводе правильного OTP до истечения времени таймера вы получите сообщение о том, что программа успешно проверила OTP, и программа завершает работу. Если вы не ввели его вовремя, вы получите сообщение о том, что срок действия OTP истек. Вы можете нажать на Повторно отправить одноразовый код кнопку, чтобы создать новый OTP и отправить его на свой телефон.

Если вы введете неправильный OTP, программа выведет на экран окно сообщения с текстом ОТП не подходит.

Если вы трижды введете неправильный OTP, все поля будут отключены, а учетная запись будет заблокирована на десять минут.

Использование Twilio с Python

С помощью Twilio можно построить систему смс-уведомлений о различных событиях. Вы можете использовать его с устройствами IoT для запуска SMS, когда что-то падает выше или ниже определенного порога или когда вы обнаруживаете злоумышленника. Вы можете создавать безопасные системы входа в систему с двухфакторной аутентификацией, создавать чат-бота WhatsApp и систему напоминаний о встречах.

Кроме того, вы можете использовать его для проверки номера телефона, маркетинговых кампаний, отправки опросов и сбора отзывов. При создании любого приложения всегда помните о ценах на Twilio API, чтобы избежать непредвиденных расходов.