Pomocí této příručky zprovozněte a zprovozněte systém ověřování OTP ve své aplikaci Python.

I když bude vaše heslo odcizeno, systémy ověřování OTP slouží jako zásadní faktor bezpečnosti. Odstraňuje nutnost pamatovat si hesla, slouží jako další vrstva zabezpečení a snižuje rizika phishingu.

Naučte se vytvořit ověřovací systém OTP pomocí Pythonu, který vám pošle OTP na vaše mobilní číslo platí pouze dvě minuty a váš účet se zablokuje, pokud třikrát zadáte nesprávné jednorázové heslo v a řádek.

Nainstalujte moduly Tkinter, Twilio a Random Modules

Tkinter vám to umožňuje vytvářet desktopové aplikace. Nabízí řadu widgetů, jako jsou tlačítka, štítky a textová pole, které usnadňují vývoj aplikací.

Modul Twilio vám s tím pomůže integrovat komunikační funkce, jako je SMS, MMS, telefonní hovory a ověřování přímo do vaší aplikace. Má cloudovou infrastrukturu spolu s úžasnými funkcemi, jako je poskytování čísel, šablony zpráv a nahrávání hovorů.

Chcete-li nainstalovat moduly Twilio a Tkinter, spusťte v terminálu následující příkaz:

instagram viewer
pip install twilio tk

Modul Random je vestavěný modul Pythonu používaný pro generování pseudonáhodných čísel. Díky tomu můžete generovat náhodná čísla, vybírat náhodné prvky ze seznamu, zamíchat obsah seznamu a další. Můžete jej použít k vytvoření simulace hodu kostkou, míchání seznamu nebo a generátor náhodných hesel.

Vygenerujte Twilio API a získejte telefonní číslo

Chcete-li používat Twilio a odesílat požadavky na OTP na váš mobilní telefon, potřebujete ověřovací údaje spolu s telefonním číslem Twilio. Dosáhnout toho:

  1. Zaregistrujte se k účtu Twilio a navštivte Konzole Twilio.
  2. Přejděte dolů a klikněte na Získejte telefonní číslo knoflík. Zkopírujte vygenerované telefonní číslo.
  3. Přejděte dolů na Informace o účtu sekce. Zkopírujte SID účtu a Auth Token.

Budování struktury aplikace

Celý zdrojový kód pro sestavení OTP Verification System pomocí Pythonu najdete v tomto úložiště GitHub.

Importujte potřebné moduly a nastavte ověřovací údaje. Inicializujte klienta Twilio, aby se ověřil a stal se vstupním bodem pro volání API. Nastavte dobu expirace na dvě minuty.

Definujte třídu, Ověření OTPV, a inicializujte konstruktor pro nastavení výchozích hodnot proměnných spolu s inicializací kořenového okna a nastavením názvu a rozměrů aplikace.

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

Definujte tři štítky pro vyžádání čísla mobilního telefonu a OTP a pro zobrazení časovače poté, co program odešle OTP. Nastavte nadřazený prvek, text, který má zobrazovat, a styly písma, které by měl mít. Podobně vytvořte dva vstupní widgety, abyste získali vstup od uživatele. Nastavte jeho nadřazený prvek, jeho šířku a styly písma.

Vytvořte tři tlačítka pro odeslání jednorázového hesla, opětovného odeslání jednorázového hesla a ověření jednorázového hesla. Nastavte jeho nadřazený prvek, text, který se má zobrazit, příkaz, který má provést po kliknutí, a jeho styly písma. Uspořádejte tyto prvky pomocí balíček metoda.

 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()

Budování funkčnosti aplikace

Definujte metodu, start_timer() že běží timer_countdown v samostatném vláknu.

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

Definujte metodu, timer_countdown(). Zaznamenejte počáteční čas a spusťte nekonečnou smyčku, která měří aktuální čas a vypočítává uplynulý a zbývající čas. Li stop_timer je pravda, ukončete smyčku. Pokud je zbývající čas menší nebo roven nule, zobrazí se okno s chybovou zprávou, že platnost jednorázového hesla vypršela.

Aktivujte tlačítko znovu odeslat OTP, nastavte OTP na žádné a ukončete. V opačném případě vypočítejte zbývající minuty a sekundy, zobrazte je na štítku časovače a na jednu sekundu uspěte.

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)

Definujte metodu, send_otp(). Li uzamčeno je pravda, zobrazí příslušnou zprávu. V opačném případě vyjměte telefonní číslo, ověřte ho a vygenerujte náhodné jednorázové heslo. Předejte mobilní telefon, který jste získali dříve, a použijte klienta k odeslání OTP na vaše telefonní číslo. Zobrazte okno se zprávou, spusťte časovač, deaktivujte tlačítka a zcela vymažte položku.

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)

Definujte metodu, resend_otp(). Pokud je uzamčen, zobrazte příslušnou zprávu. V opačném případě získejte telefonní číslo, ověřte ho, vygenerujte náhodné jednorázové heslo, znovu odešlete jednorázové heslo, zobrazte okno se zprávou, spusťte časovač a deaktivujte tlačítko opětovného odeslání jednorázového hesla.

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)

Definujte metodu, ověřit_otp(). Získejte OTP a zkontrolujte, zda uživatel nic nezadal. Pokud je uložený OTP Žádný, požádejte uživatele, aby nejprve vygeneroval OTP. Pokud se zadané OTP shoduje s uloženým, zobrazte zprávu o úspěšném ověření OTP, zastavte časovač a ukončete program. V opačném případě zkontrolujte chybné pokusy. Pokud počet chybných pokusů překročí tři, zamkněte účet.

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.')

Definujte metodu, lock_account(). Nastavte uzamčený stav na true a zobrazte štítek jako Účet uzamčen. Deaktivujte všechny štítky, položky a tlačítka. Zastavte stávající časovač a spusťte nový na deset minut.

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)

Definujte metodu start_countdown(). Pokud je zbývající čas menší nebo roven nule, resetujte účet. V opačném případě zobrazte, že program uzamkl účet, a zkuste to znovu ve zbývajícím čase pomocí zpětného volání.

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)

Definujte funkci, reset_account(). Obnovte stav všech widgetů a proměnných jako dříve.

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

Vytvořte kořenové okno, instanci třídy, a spusťte aplikaci Tkinter.

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

Příklad výstupu ověření pomocí jednorázového hesla

Při spuštění programu OTP Verification se zobrazí okno s výzvou k zadání vašeho mobilního čísla. Zadejte jej spolu s kódem země a stiskněte Odeslat OTP knoflík. Zobrazí se zpráva, že program úspěšně odeslal jednorázové heslo a tlačítko se na dvě minuty deaktivuje. Zkontrolujte, zda váš telefon neobsahuje jednorázové heslo, a zadejte jej před vypršením platnosti.

Po zadání správného OTP před vypršením časovače se zobrazí zpráva, že program úspěšně ověřil jednorázové heslo a program se ukončí. V případě, že jste jej nezadali včas, zobrazí se okno se zprávou, že platnost jednorázového hesla vypršela. Můžete kliknout na Znovu odeslat OTP tlačítko pro vygenerování nového jednorázového hesla a jeho odeslání do telefonu.

Pokud zadáte špatné heslo, program zobrazí okno se zprávou Jednorázové heslo se neshoduje.

Pokud třikrát zadáte nesprávné jednorázové heslo, všechna pole se deaktivují a účet se na deset minut uzamkne.

Použití Twilio s Pythonem

Pomocí Twilio můžete sestavit systém SMS upozornění na různé události. Můžete jej použít se zařízeními IoT ke spouštění SMS, když něco klesne nad nebo pod určitou prahovou hodnotu nebo když zjistíte narušitele. Můžete vytvořit zabezpečené přihlašovací systémy s dvoufaktorovou autentizací, vytvořit chatbota WhatsApp a systém připomenutí schůzek.

Kromě toho jej můžete použít pro ověření telefonního čísla, marketingové kampaně, zasílání průzkumů a shromažďování zpětné vazby. Při vytváření jakékoli aplikace vždy pamatujte na ceny Twilio API, abyste se vyhnuli neočekávaným nákladům.