S pomočjo tega priročnika vzpostavite in zaženite sistem preverjanja OTP v svoji aplikaciji Python.

Tudi če vam ukradejo geslo, sistemi preverjanja OTP služijo kot ključni dejavnik za varnost. Odpravlja potrebo po pomnjenju gesel, služi kot dodatna plast varnosti in zmanjšuje tveganje lažnega predstavljanja.

Naučite se zgraditi sistem preverjanja OTP z uporabo Pythona, ki vam pošlje OTP na vašo mobilno številko, je velja samo dve minuti in vaš račun se zaklene, če trikrat vnesete napačno OTP v a vrstica.

Namestite module Tkinter, Twilio in Random

Tkinter vam omogoča ustvarjanje namiznih aplikacij. Ponuja različne pripomočke, kot so gumbi, oznake in besedilna polja, ki olajšajo razvoj aplikacij.

Modul Twilio vam pomaga integrirati komunikacijske funkcije, kot je SMS, MMS, telefonski klici in preverjanje neposredno v vaši aplikaciji. Ima infrastrukturo v oblaku skupaj z neverjetnimi funkcijami, kot so zagotavljanje številk, predloge sporočil in snemanje klicev.

Če želite namestiti modula Twilio in Tkinter, zaženite naslednji ukaz v terminalu:

instagram viewer
pip install twilio tk

Modul Random je vgrajen modul Python, ki se uporablja za generiranje psevdonaključnih števil. S tem lahko ustvarite naključna števila, izberete naključne elemente s seznama, premešate vsebino seznama in drugo. Uporabite ga lahko za izdelavo simulacije meta kocke, mešalnika seznamov ali a generator naključnih gesel.

Ustvarite Twilio API in pridobite telefonsko številko

Če želite uporabljati Twilio in pošiljati zahteve OTP na svoj mobilni telefon, potrebujete poverilnice za preverjanje pristnosti skupaj s telefonsko številko Twilio. Da bi to dosegli:

  1. Prijavite se za račun Twilio in obiščite Twilio konzola.
  2. Pomaknite se navzdol in kliknite na Pridobite telefonsko številko gumb. Kopirajte ustvarjeno telefonsko številko.
  3. Pomaknite se navzdol do Informacije o računu razdelek. Kopiraj SID računa in Auth Token.

Gradnja strukture aplikacije

Tukaj lahko najdete celotno izvorno kodo za izdelavo sistema preverjanja OTP z uporabo Pythona Repozitorij GitHub.

Uvozite potrebne module in nastavite poverilnice za preverjanje pristnosti. Inicializirajte odjemalca Twilio za preverjanje pristnosti in bo vstopna točka za klice API-ja. Nastavite čas izteka na dve minuti.

Določite razred, preverjanje OTP, in inicializirajte konstruktor za nastavitev privzetih vrednosti spremenljivk skupaj z inicializacijo korenskega okna ter nastavitvijo naslova in dimenzij aplikacije.

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

Določite tri oznake za povpraševanje po številki mobilnega telefona in OTP ter za prikaz časovnika, potem ko program pošlje OTP. Nastavite nadrejeni element, besedilo, ki naj se prikaže, in sloge pisave, ki jih mora imeti. Podobno ustvarite dva gradnika za vnos, da dobite vnos od uporabnika. Nastavite njegov nadrejeni element, njegovo širino in sloge pisave.

Ustvarite tri gumbe za pošiljanje OTP, ponovno pošiljanje OTP in preverjanje OTP. Nastavite njegov nadrejeni element, besedilo, ki naj se prikaže, ukaz, ki naj ga izvede ob kliku, in njegove sloge pisave. Organizirajte te elemente z uporabo paket 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()

Izgradnja funkcionalnosti aplikacije

Določite metodo, start_timer() ki teče timer_countdown v ločeni temi.

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

Določite metodo, timer_countdown(). Zabeležite začetni čas in zaženite neskončno zanko, ki vzame trenutni čas ter izračuna pretečeni in preostali čas. če stop_timer je res, prekinite zanko. Če je preostali čas manjši ali enak nič, prikažite polje s sporočilom o napaki, ki pravi, da je OTP potekel.

Aktivirajte gumb za ponovno pošiljanje OTP, nastavite OTP na nič in prekinite. V nasprotnem primeru izračunajte preostale minute in sekunde, jih prikažite na nalepki časovnika in preklopite v mirovanje za eno sekundo.

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)

Določite metodo, send_otp(). če zaklenjen je res, prikaži ustrezno sporočilo. V nasprotnem primeru izvlecite telefonsko številko, jo potrdite in ustvarite naključno OTP. Predajte mobilni telefon, ki ste ga dobili prej, in uporabite odjemalca, da pošljete OTP na vašo telefonsko številko. Prikažite okno s sporočilom, zaženite časovnik, onemogočite gumbe in popolnoma počistite vnos.

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)

Določite metodo, resend_otp(). Če je zaklenjeno, prikaže ustrezno sporočilo. V nasprotnem primeru pridobite telefonsko številko, jo potrdite, ponovno ustvarite naključno OTP, ponovno pošljite OTP, prikažite okno s sporočilom, zaženite časovnik in onemogočite gumb za ponovno pošiljanje 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)

Določite metodo, preveri_otp(). Pridobite OTP in preverite, ali uporabnik ni vnesel ničesar. Če je shranjeni OTP Noben, prosite uporabnika, naj najprej ustvari OTP. Če se OTP, ki ga je vnesel uporabnik, ujema s shranjenim, prikažite sporočilo o uspešnem preverjanju OTP, ustavite časovnik in zapustite program. V nasprotnem primeru preverite napačne poskuse. Če število napačnih poskusov preseže tri, zaklenite račun.

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

Določite metodo, zakleni_račun(). Nastavite zaklenjeno stanje na true in prikažite oznako kot Račun zaklenjen. Onemogočite vse oznake, vnose in gumbe. Ustavite obstoječi časovnik in začnite novega za 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)

Določite metodo start_countdown(). Če je preostali čas manjši ali enak nič, ponastavite račun. V nasprotnem primeru prikažite, da je program zaklenil račun, in poskusite znova v preostalem času s povratnim klicem.

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)

Definirajte funkcijo, reset_account(). Ponastavite stanje vseh gradnikov in spremenljivk kot prej.

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

Ustvarite korensko okno, primerek razreda in zaženite aplikacijo Tkinter.

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

Primer izhoda preverjanja z uporabo OTP

Ko zaženete program za preverjanje OTP, se prikaže okno, v katerem morate vnesti svojo mobilno številko. Vnesite jo skupaj s kodo svoje države in pritisnite Pošlji OTP gumb. Dobite sporočilo, da je program uspešno poslal OTP in gumb se deaktivira za dve minuti. Preverite svoj telefon za OTP in ga vnesite, preden poteče.

Ko vnesete pravilno OTP, preden se časovnik izteče, prejmete sporočilo, da je program uspešno preveril OTP, in program se zapre. Če ga niste vnesli pravočasno, boste prejeli okno s sporočilom, da je OTP potekel. Lahko kliknete na Ponovno pošlji OTP gumb za ustvarjanje novega OTP in pošiljanje v vaš telefon.

Če vnesete napačen OTP, program prikaže okno s sporočilom OTP se ne ujema.

Če trikrat vnesete napačno OTP, so vsa polja onemogočena in račun se zaklene za deset minut.

Uporaba Twilia s Pythonom

Z uporabo Twilia lahko zgradite sistem SMS obveščanja za različne dogodke. Uporabite ga lahko z napravami IoT za sprožitev sporočila SMS, ko nekaj pade nad ali pod določeno mejno vrednost ali ko zaznate vsiljivca. Ustvarite lahko varne prijavne sisteme z dvofaktorsko avtentikacijo, zgradite klepetalni robot WhatsApp in sistem opomnikov za sestanke.

Poleg tega ga lahko uporabite za preverjanje telefonske številke, marketinške akcije, pošiljanje anket in zbiranje povratnih informacij. Pri gradnji katere koli aplikacije bodite vedno pozorni na cene API-ja Twilio, da se izognete nepričakovanim stroškom.