Uz pomoć ovog vodiča pokrenite OTP sustav provjere u svojoj Python aplikaciji.
Čak i ako vaša lozinka bude ukradena, OTP sustavi provjere služe kao ključni čimbenik za sigurnost. Uklanja potrebu za pamćenjem lozinki, služi kao dodatni sloj sigurnosti i smanjuje rizik od krađe identiteta.
Naučite izgraditi OTP sustav verifikacije pomoću Pythona koji vam šalje OTP na vaš mobilni broj, vrijedi samo dvije minute i vaš račun se zaključava ako tri puta unesete krivi OTP u a red.
Instalirajte module Tkinter, Twilio i Random
Tkinter vam to omogućuje kreirati desktop aplikacije. Nudi razne widgete kao što su gumbi, oznake i tekstualni okviri koji olakšavaju razvoj aplikacija.
Twilio modul vam pomaže da integrirati komunikacijske funkcije poput SMS-a, MMS, telefonski pozivi i provjera izravno u vašu aplikaciju. Ima infrastrukturu temeljenu na oblaku zajedno s nevjerojatnim značajkama kao što su dodjela brojeva, predlošci poruka i snimanje poziva.
Da biste instalirali Twilio i Tkinter module, pokrenite sljedeću naredbu u terminalu:
pip install twilio tk
Random modul je ugrađeni Python modul koji se koristi za generiranje pseudo-slučajnih brojeva. Pomoću toga možete generirati nasumične brojeve, odabrati nasumične elemente s popisa, miješati sadržaj popisa i još mnogo toga. Možete ga koristiti za izradu simulacije bacanja kockice, popisa za miješanje ili generator slučajnih lozinki.
Generirajte Twilio API i nabavite broj telefona
Da biste koristili Twilio i slali OTP zahtjeve na svoj mobilni telefon, potrebne su vam vjerodajnice za autentifikaciju zajedno s Twilio telefonskim brojem. Da biste to postigli:
- Prijavite se za Twilio račun i posjetite Twilio konzola.
- Pomaknite se prema dolje i kliknite na Dobiti telefonski broj dugme. Kopirajte generirani telefonski broj.
- Pomaknite se prema dolje do Informacije računa odjeljak. Kopiraj SID računa i Auth Token.
Izgradnja strukture aplikacije
Ovdje možete pronaći cijeli izvorni kod za izgradnju OTP sustava provjere pomoću Pythona GitHub spremište.
Uvezite potrebne module i postavite vjerodajnice za provjeru autentičnosti. Inicijalizirajte Twilio klijenta za autentifikaciju i da bude ulazna točka za API pozive. Postavite vrijeme isteka na dvije minute.
Definirajte klasu, OTP potvrda, i inicijalizirati konstruktor za postavljanje zadanih vrijednosti varijabli zajedno s inicijalizacijom korijenskog prozora i postavljanjem naslova i dimenzija aplikacije.
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
Definirajte tri oznake za traženje broja mobitela i OTP-a te za prikaz mjerača vremena nakon što program pošalje OTP. Postavite nadređeni element, tekst koji bi trebao prikazati i stilove fonta koje bi trebao imati. Slično, izradite dva widgeta za unos kako biste dobili unos od korisnika. Postavite njegov nadređeni element, njegovu širinu i stilove fonta.
Napravite tri gumba za slanje OTP-a, ponovno slanje OTP-a i Potvrdu OTP-a. Postavite nadređeni element, tekst koji bi trebao prikazati, naredbu koju bi trebao izvršiti kada se klikne i njegove stilove fonta. Organizirajte ove elemente pomoću 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
Definirajte metodu, start_timer() koji trči tajmer_odbrojavanje u zasebnoj temi.
defstart_timer(self):
self.timer_thread = threading.Thread(target=self.timer_countdown)
self.timer_thread.start()
Definirajte metodu, tajmer_countdown(). Zabilježite vrijeme početka i pokrenite beskonačnu petlju koja uzima trenutno vrijeme i izračunava proteklo i preostalo vrijeme. Ako stop_timer je istina, prekinuti petlju. Ako je preostalo vrijeme manje ili jednako nuli, prikažite okvir s porukom o pogrešci u kojem piše da je OTP istekao.
Aktivirajte gumb za ponovno slanje OTP-a, postavite OTP na ništa i prekinite. U suprotnom, izračunajte preostale minute i sekunde, prikažite ih na oznaci mjerača vremena i uspavajte jednu sekundu.
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)
Definirajte metodu, send_otp(). Ako zaključan je istina, prikazati odgovarajuću poruku. U suprotnom izdvojite telefonski broj, potvrdite ga i generirajte nasumični OTP. Dodajte mobilni telefon koji ste ranije dobili i pomoću klijenta pošaljite OTP na svoj broj telefona. Prikažite okvir s porukom, pokrenite mjerač vremena, onemogućite gumbe i potpuno izbrišite unos.
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)
Definirajte metodu, ponovno pošalji otp(). Ako je zaključano, prikazati odgovarajuću poruku. U suprotnom, uzmite telefonski broj, potvrdite ga, ponovno generirajte nasumični OTP, ponovno pošaljite OTP, prikažite okvir s porukom, pokrenite mjerač vremena i onemogućite gumb za ponovno slanje OTP-a.
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)
Definirajte metodu, verify_otp(). Uzmite OTP i provjerite nije li korisnik ništa unio. Ako je pohranjeni OTP Nijedan, zamolite korisnika da najprije generira OTP. Ako OTP koji je korisnik unio odgovara pohranjenom, prikazati poruku o uspješnoj OTP potvrdi, zaustaviti mjerač vremena i izaći iz programa. U protivnom provjerite ima li pogrešnih pokušaja. Ako pogrešna pokušaja premaše tri, zaključajte 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.')
Definirajte metodu, zaključaj_račun(). Postavite status zaključano na istinito i prikažite oznaku kao Račun zaključan. Onemogućite sve oznake, unose i gumbe. Zaustavite postojeći mjerač vremena i pokrenite novi na deset minuta.
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)
Definirajte metodu početak_odbrojavanja(). Ako je preostalo vrijeme manje ili jednako nuli, resetirajte račun. U suprotnom, prikažite da je program zaključao račun i pokušajte ponovno u preostalom vremenu koristeći povratni poziv.
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 funkciju, reset_account(). Ponovno postavite status svih widgeta i varijabli kao prije.
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
Napravite korijenski prozor, instancu klase i pokrenite aplikaciju Tkinter.
if __name__ == '__main__':
root = tk.Tk()
otp_verification = OTPVerification(root)
root.mainloop()
Primjer izlaza provjere pomoću OTP-a
Kada pokrenete OTP Verification program, dobit ćete prozor u kojem se od vas traži da unesete svoj broj mobitela. Unesite ga zajedno s pozivnim brojem svoje zemlje i pritisnite Pošalji OTP dugme. Dobivate poruku da je program uspješno poslao OTP i gumb se deaktivira na dvije minute. Provjerite ima li na vašem telefonu OTP i unesite ga prije nego što istekne.
Kada unesete točan OTP prije nego što istekne vrijeme, dobit ćete poruku da je program uspješno provjerio OTP i program izlazi. U slučaju da ga niste unijeli na vrijeme, dobit ćete okvir s porukom da je OTP istekao. Možete kliknuti na Ponovno pošalji OTP gumb za generiranje novog OTP-a i slanje na vaš telefon.
Ako unesete pogrešan OTP, program prikazuje okvir s porukom OTP ne odgovara.
Ako tri puta unesete pogrešan OTP, sva će polja biti onemogućena, a račun će se zaključati na deset minuta.
Korištenje Twilia s Pythonom
Koristeći Twilio, možete izgraditi sustav SMS obavijesti za različite događaje. Možete ga koristiti s IoT uređajima za pokretanje SMS-a kada nešto padne iznad ili ispod određenog praga ili kada otkrijete uljeza. Možete izgraditi sigurne sustave prijave s dvofaktorskom autentifikacijom, izgraditi WhatsApp chatbot i sustav podsjetnika za sastanke.
Osim toga, možete ga koristiti za provjeru telefonskog broja, marketinške kampanje, slanje anketa i prikupljanje povratnih informacija. Dok gradite bilo koju aplikaciju, uvijek vodite računa o cijenama Twilio API-ja kako biste izbjegli neočekivane troškove.