Pomocou tejto príručky spustite systém overovania OTP vo svojej aplikácii Python.
Aj keď vám heslo ukradnú, systémy overovania OTP slúžia ako kľúčový faktor bezpečnosti. Odstraňuje potrebu pamätať si heslá, slúži ako ďalšia vrstva zabezpečenia a znižuje riziká phishingu.
Naučte sa zostaviť systém overovania OTP pomocou Pythonu, ktorý vám pošle OTP na vaše mobilné číslo platí len dve minúty a váš účet sa zablokuje, ak trikrát zadáte nesprávne jednorazové heslo v a riadok.
Nainštalujte moduly Tkinter, Twilio a Random Modules
Tkinter vám to umožňuje vytvárať desktopové aplikácie. Ponúka množstvo miniaplikácií, ako sú tlačidlá, štítky a textové polia, ktoré uľahčujú vývoj aplikácií.
Modul Twilio vám v tom pomôže integrovať komunikačné funkcie ako SMS, MMS, telefónne hovory a overenie priamo do vašej aplikácie. Má cloudovú infraštruktúru spolu s úžasnými funkciami, ako je poskytovanie čísel, šablóny správ a nahrávanie hovorov.
Ak chcete nainštalovať moduly Twilio a Tkinter, spustite v termináli nasledujúci príkaz:
pip install twilio tk
Modul Random je vstavaný modul Pythonu, ktorý sa používa na generovanie pseudonáhodných čísel. Pomocou toho môžete generovať náhodné čísla, vyberať náhodné prvky zo zoznamu, premiešať obsah zoznamu a podobne. Môžete ho použiť na vytvorenie simulácie hodu kockou, miešania zoznamov alebo a generátor náhodných hesiel.
Vygenerujte Twilio API a získajte telefónne číslo
Ak chcete používať Twilio a odosielať žiadosti o jednorazové heslo na váš mobilný telefón, potrebujete overovacie údaje spolu s telefónnym číslom Twilio. Aby ste to dosiahli:
- Prihláste sa na účet Twilio a navštívte stránku Konzola Twilio.
- Prejdite nadol a kliknite na Získajte telefónne číslo tlačidlo. Skopírujte vygenerované telefónne číslo.
- Prejdite nadol na Informácie o účte oddiele. Skopírujte SID účtu a Auth Token.
Budovanie štruktúry aplikácie
Celý zdrojový kód na vytvorenie systému overovania OTP pomocou Pythonu nájdete v tomto úložisko GitHub.
Importujte potrebné moduly a nastavte autentifikačné poverenia. Inicializujte klienta Twilio, aby sa autentifikoval a stal sa vstupným bodom pre volania API. Nastavte čas vypršania na dve minúty.
Definujte triedu, OTPVverifikácia, a inicializujte konštruktor na nastavenie predvolených hodnôt premenných spolu s inicializáciou koreňového okna a nastavením názvu a rozmerov aplikácie.
import tkinter as tk
from tkinter import messagebox
from twilio.rest import Client
import random
import threading
import timeaccount_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 tri štítky na vyžiadanie čísla mobilného telefónu a jednorazového hesla a na zobrazenie časovača po odoslaní jednorazového hesla programom. Nastavte nadradený prvok, text, ktorý sa má zobraziť, a štýly písma, ktoré by mal mať. Podobne vytvorte dva vstupné widgety, aby ste získali vstup od používateľa. Nastavte jeho nadradený prvok, jeho šírku a štýly písma.
Vytvorte tri tlačidlá na odoslanie OTP, opätovné odoslanie OTP a Overenie OTP. Nastavte jeho nadradený prvok, text, ktorý sa má zobraziť, príkaz, ktorý má vykonať po kliknutí, a jeho štýly písma. Usporiadajte tieto prvky pomocou balenie metóda.
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()
Budovanie funkčnosti aplikácie
Definujte metódu, start_timer() že beží timer_countdown v samostatnom vlákne.
defstart_timer(self):
self.timer_thread = threading.Thread(target=self.timer_countdown)
self.timer_thread.start()
Definujte metódu, timer_countdown(). Zaznamenajte čas začiatku a spustite nekonečnú slučku, ktorá berie aktuálny čas a vypočítava uplynutý a zostávajúci čas. Ak stop_timer je pravda, ukončite cyklus. Ak je zostávajúci čas menší alebo rovný nule, zobrazte okno s chybovým hlásením, že platnosť OTP vypršala.
Aktivujte tlačidlo opätovného odoslania OTP, nastavte jednorazové heslo na žiadne a ukončite. V opačnom prípade vypočítajte zostávajúce minúty a sekundy, zobrazte ich na štítku časovača a na jednu sekundu uspite.
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 metódu, send_otp(). Ak zamknuté je pravda, zobrazte príslušnú správu. V opačnom prípade extrahujte telefónne číslo, overte ho a vygenerujte náhodné jednorazové heslo. Odovzdajte mobilný telefón, ktorý ste dostali predtým, a použite klienta na odoslanie OTP na vaše telefónne číslo. Zobrazte okno so správou, spustite časovač, deaktivujte tlačidlá a úplne vymažte zadanie.
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 metódu, resend_otp(). Ak je uzamknutý, zobrazte príslušnú správu. V opačnom prípade získajte telefónne číslo, overte ho, vygenerujte náhodné jednorazové heslo, znova odošlite jednorazové heslo, zobrazte okno so správou, spustite časovač a deaktivujte tlačidlo opätovného odoslania jednorazové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 metódu, over_otp(). Získajte jednorazové heslo a skontrolujte, či používateľ nič nezadal. Ak je uložené jednorazové heslo žiadne, požiadajte používateľa, aby najskôr vygeneroval jednorazové heslo. Ak sa zadané jednorazové heslo zhoduje s uloženým, zobrazte správu o úspešnom overení jednorazového hesla, zastavte časovač a ukončite program. V opačnom prípade skontrolujte nesprávne pokusy. Ak počet nesprávnych pokusov presiahne tri, uzamknite úč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 metódu, lock_account(). Nastavte uzamknutý stav na true a zobrazte štítok ako Účet je uzamknutý. Vypnite všetky štítky, položky a tlačidlá. Zastavte existujúci časovač a spustite nový na desať minút.
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 metódu start_countdown(). Ak je zostávajúci čas menší alebo rovný nule, resetujte účet. V opačnom prípade zobrazte, že program uzamkol účet a skúste to znova v zostávajúcom čase pomocou spätného volania.
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 funkciu, reset_account(). Obnovte stav všetkých miniaplikácií a premenných ako predtým.
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
Vytvorte koreňové okno, inštanciu triedy, a spustite aplikáciu Tkinter.
if __name__ == '__main__':
root = tk.Tk()
otp_verification = OTPVerification(root)
root.mainloop()
Príklad výstupu overenia pomocou jednorazového hesla
Po spustení programu overenia OTP sa zobrazí okno s výzvou na zadanie čísla mobilného telefónu. Zadajte ho spolu s kódom krajiny a stlačte Odoslať jednorazové heslo tlačidlo. Dostanete správu, že program úspešne odoslal jednorazové heslo a tlačidlo sa na dve minúty deaktivuje. Skontrolujte, či máte v telefóne jednorazové heslo a zadajte ho pred vypršaním jeho platnosti.
Po zadaní správneho OTP pred vypršaním časovača dostanete správu, že program úspešne overil jednorazové heslo a program sa ukončí. V prípade, že ste ho nezadali včas, dostanete správu, že jednorazové heslo vypršalo. Môžete kliknúť na Znova odoslať jednorazové heslo na vygenerovanie nového OTP a jeho odoslanie do telefónu.
Ak zadáte nesprávne OTP, program zobrazí okno so správou Jednorazové heslo sa nezhoduje.
Ak trikrát zadáte nesprávne jednorazové heslo, všetky polia sa deaktivujú a účet sa na desať minút zablokuje.
Používanie Twilio s Pythonom
Pomocou Twilio si môžete vybudovať SMS notifikačný systém pre rôzne udalosti. Môžete ho použiť so zariadeniami internetu vecí na spustenie SMS, keď niečo klesne nad alebo pod určitú hranicu alebo keď zaznamenáte narušiteľa. Môžete si vytvoriť bezpečné prihlasovacie systémy s dvojfaktorovou autentifikáciou, vytvoriť chatbota WhatsApp a systém pripomínania schôdzok.
Okrem toho ho môžete použiť na overenie telefónneho čísla, marketingové kampane, odosielanie prieskumov a zhromažďovanie spätnej väzby. Pri vytváraní akejkoľvek aplikácie vždy pamätajte na ceny Twilio API, aby ste sa vyhli neočakávaným nákladom.