Направете системата за проверка на OTP във вашето приложение на Python с помощта на това ръководство.

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

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

Инсталирайте модули Tkinter, Twilio и Random

Tkinter ви позволява създаване на настолни приложения. Той предлага разнообразие от джаджи като бутони, етикети и текстови полета, които улесняват разработването на приложения.

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

instagram viewer

За да инсталирате модулите Twilio и Tkinter, изпълнете следната команда в терминала:

pip install twilio tk

Модулът Random е вграден модул на Python, използван за генериране на псевдослучайни числа. С това можете да генерирате произволни числа, да избирате произволни елементи от списък, да разбърквате съдържанието на списък и др. Можете да го използвате, за да създадете симулация на хвърляне на зар, разбъркване на списък или a генератор на произволни пароли.

Генерирайте API на Twilio и вземете телефонен номер

За да използвате Twilio и да изпращате OTP заявки до мобилния си телефон, вие се нуждаете от идентификационни данни за удостоверяване заедно с телефонен номер в Twilio. За да постигнете това:

  1. Регистрирайте се за акаунт в Twilio и посетете Twilio конзола.
  2. Превъртете надолу и щракнете върху Вземете телефонен номер бутон. Копирайте генерирания телефонен номер.
  3. Превъртете надолу до Информация за акаунта раздел. Копирайте SID на акаунта и на Токен за удостоверяване.

Изграждане на структурата на приложението

Можете да намерите целия изходен код за изграждане на OTP система за проверка с помощта на Python тук GitHub хранилище.

Импортирайте необходимите модули и задайте идентификационните данни за удостоверяване. Инициализирайте клиента Twilio за удостоверяване и бъдете входна точка за извиквания на API. Задайте времето на изтичане на две минути.

Определете клас, OTP проверка, и инициализирайте конструктора, за да зададете стойностите по подразбиране на променливите заедно с инициализирането на главния прозорец и задаването на заглавието и размерите на приложението.

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, повторно изпращане на 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() който работи таймер_отброяване в отделна тема.

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. Предайте мобилния телефон, който сте получили по-рано, и използвайте клиента, за да изпратите 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(). Ако е заключено, покажете съответното съобщение. В противен случай вземете телефонния номер, потвърдете го, генерирайте отново произволен OTP, изпратете отново OTP, покажете полето за съобщения, стартирайте таймера и деактивирайте бутона за повторно изпращане на 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. Ако 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 ще получите прозорец с молба да въведете мобилния си номер. Въведете го заедно с кода на вашата държава и натиснете Изпратете OTP бутон. Получавате съобщение, че програмата е изпратила OTP успешно и бутонът се деактивира за две минути. Проверете телефона си за OTP и го въведете, преди да изтече.

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

Ако въведете грешен OTP, програмата показва прозорец със съобщение, казващ OTP не съвпада.

Ако въведете грешен OTP три пъти, всички полета се деактивират и акаунтът се заключва за десет минути.

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

Използвайки Twilio, можете да изградите система за SMS известия за различни събития. Можете да го използвате с IoT устройства, за да задействате SMS, когато нещо падне над или под определен праг или когато откриете нарушител. Можете да изградите сигурни системи за влизане с двуфакторно удостоверяване, да изградите чатбот WhatsApp и система за напомняне за срещи.

Освен това можете да го използвате за проверка на телефонен номер, маркетингови кампании, изпращане на анкети и събиране на обратна връзка. Докато създавате всяко приложение, винаги имайте предвид цените на Twilio API, за да избегнете неочаквани разходи.