Breng het OTP-verificatiesysteem in gebruik in uw Python-toepassing met behulp van deze handleiding.
Zelfs als uw wachtwoord wordt gestolen, dienen OTP-verificatiesystemen als een cruciale factor voor beveiliging. Het elimineert de noodzaak om wachtwoorden te onthouden, dient als een extra beveiligingslaag en vermindert de risico's van phishing.
Leer een OTP-verificatiesysteem bouwen met behulp van Python dat u een OTP naar uw mobiele nummer stuurt slechts twee minuten geldig en uw account wordt vergrendeld als u driemaal de verkeerde OTP invoert in een rij.
Installeer Tkinter-, Twilio- en willekeurige modules
Tkinter staat je toe bureaubladtoepassingen maken. Het biedt een verscheidenheid aan widgets zoals knoppen, labels en tekstvakken die het gemakkelijker maken om applicaties te ontwikkelen.
De Twilio-module helpt u daarbij integratie van communicatiefunctionaliteiten zoals SMS, mms, telefoontjes en verificatie rechtstreeks in uw applicatie. Het heeft een cloudgebaseerde infrastructuur en geweldige functies zoals nummerregistratie, berichtsjablonen en gespreksopname.
Voer de volgende opdracht uit in de terminal om de Twilio- en Tkinter-modules te installeren:
pip install twilio tk
De Random-module is een ingebouwde Python-module die wordt gebruikt voor het genereren van pseudo-willekeurige getallen. Hiermee kun je willekeurige getallen genereren, willekeurige elementen uit een lijst kiezen, de inhoud van een lijst in willekeurige volgorde afspelen en meer. Je kunt het gebruiken om een dobbelsteensimulatie, een lijstschudder of een willekeurige wachtwoordgenerator.
Genereer de Twilio API en verkrijg een telefoonnummer
Om Twilio te gebruiken en OTP-verzoeken naar uw mobiele telefoon te verzenden, hebt u authenticatiereferenties en een Twilio-telefoonnummer nodig. Om dit te behalen:
- Meld u aan voor een Twilio-account en bezoek de Twilio-console.
- Scroll naar beneden en klik op de Krijg telefoonnummer knop. Kopieer het gegenereerde telefoonnummer.
- Scroll naar beneden naar de Account informatie sectie. Kopieer de Account-SID en de Authentiekoken.
De structuur van de applicatie bouwen
Hierin vindt u de volledige broncode voor het bouwen van een OTP-verificatiesysteem met behulp van Python GitHub-opslagplaats.
Importeer de benodigde modules en stel de authenticatiereferenties in. Initialiseer de Twilio-client om te verifiëren en het toegangspunt te zijn voor API-aanroepen. Stel de vervaltijd in op twee minuten.
Definieer een klasse, OTPVerificatie, en initialiseer de constructor om de standaardwaarden van variabelen in te stellen, samen met het initialiseren van het hoofdvenster en het instellen van de titel en afmetingen van de toepassing.
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
Definieer drie labels om een mobiel nummer en een OTP te vragen, en om een timer weer te geven nadat het programma een OTP heeft verzonden. Stel het bovenliggende element in, de tekst die moet worden weergegeven en de lettertypestijlen die het moet hebben. Maak op dezelfde manier twee invoerwidgets om invoer van de gebruiker te krijgen. Stel het bovenliggende element, de breedte en de lettertypestijlen in.
Maak drie knoppen om OTP te verzenden, OTP opnieuw te verzenden en OTP te verifiëren. Stel het bovenliggende element in, de tekst die moet worden weergegeven, de opdracht die moet worden uitgevoerd wanneer erop wordt geklikt en de lettertypestijlen. Organiseer deze elementen met behulp van de pak methode.
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()
Bouwen aan de functionaliteit van de applicatie
Definieer een methode, start_timer() dat loopt timer_countdown in een apart draadje.
defstart_timer(self):
self.timer_thread = threading.Thread(target=self.timer_countdown)
self.timer_thread.start()
Definieer een methode, timer_countdown(). Noteer de starttijd en voer een oneindige lus uit die de huidige tijd neemt en de verstreken en resterende tijd berekent. Als stop_timer waar is, beëindig de lus. Als de resterende tijd kleiner is dan of gelijk is aan nul, geeft u een foutbericht weer waarin staat dat de OTP is verlopen.
Activeer de OTP-knop opnieuw verzenden, stel de OTP in op geen en beëindig. Bereken anders de resterende minuten en seconden, geef deze weer op het timerlabel en slaap een seconde.
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)
Definieer een methode, stuur_otp(). Als op slot waar is, geeft u het juiste bericht weer. Pak anders het telefoonnummer uit, valideer het en genereer een willekeurige OTP. Geef de mobiele telefoon die je eerder hebt gekregen door en gebruik de client om de OTP naar je telefoonnummer te sturen. Geef een berichtvenster weer, start de timer, schakel de knoppen uit en wis de invoer volledig.
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)
Definieer een methode, opnieuw verzenden_otp(). Geef het juiste bericht weer als het is vergrendeld. Vraag anders het telefoonnummer op, valideer het, genereer een willekeurige OTP opnieuw, verzend de OTP opnieuw, geef het berichtvenster weer, start de timer en schakel de OTP-knop opnieuw verzenden uit.
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)
Definieer een methode, verifiëren_otp(). Haal de OTP op en controleer of de gebruiker niets heeft ingevoerd. Als de opgeslagen OTP is Geen, vraag de gebruiker om eerst de OTP te genereren. Als de OTP die de gebruiker heeft ingevoerd overeenkomt met de opgeslagen OTP, geeft u het succesvolle OTP-verificatiebericht weer, stopt u de timer en verlaat u het programma. Controleer anders op verkeerde pogingen. Als de verkeerde pogingen meer dan drie zijn, vergrendel dan het account.
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.')
Definieer een methode, lock_account(). Stel de vergrendelde status in op waar en geef het label weer als Account geblokkeerd. Schakel alle labels, vermeldingen en knoppen uit. Stop de bestaande timer en start een nieuwe voor tien minuten.
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)
Definieer een methode start_countdown(). Als de resterende tijd kleiner is dan of gelijk is aan nul, stelt u het account opnieuw in. Geef anders weer dat het programma het account heeft vergrendeld en probeer het in de resterende tijd opnieuw met een callback.
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)
Definieer een functie, reset_account(). Reset de status van alle widgets en variabelen zoals voorheen.
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
Maak het hoofdvenster, een instantie van de klasse, en voer de toepassing Tkinter uit.
if __name__ == '__main__':
root = tk.Tk()
otp_verification = OTPVerification(root)
root.mainloop()
Voorbeelduitvoer van verificatie met behulp van OTP
Bij het uitvoeren van het OTP-verificatieprogramma krijgt u een venster waarin u wordt gevraagd uw mobiele nummer in te voeren. Voer het samen met uw landcode in en klik op OTP verzenden knop. U krijgt een bericht dat het programma de OTP succesvol heeft verzonden en de knop wordt gedurende twee minuten gedeactiveerd. Controleer uw telefoon op OTP en voer deze in voordat deze verloopt.
Bij het invoeren van de juiste OTP voordat de timer afloopt, krijgt u een bericht dat het programma de OTP met succes heeft geverifieerd en wordt het programma afgesloten. Als je het niet op tijd hebt ingevoerd, krijg je een berichtvenster waarin staat dat de OTP is verlopen. U kunt op de klikken OTP opnieuw verzenden knop om een nieuwe OTP te genereren en naar uw telefoon te sturen.
Als u de verkeerde OTP invoert, geeft het programma een berichtvenster weer met de tekst OTP komt niet overeen.
Als u drie keer de verkeerde OTP invoert, worden alle velden uitgeschakeld en wordt het account tien minuten vergrendeld.
Twilio gebruiken met Python
Met Twilio kunt u een SMS-meldingssysteem bouwen voor verschillende evenementen. Je kunt het gebruiken met IoT-apparaten om sms te activeren wanneer iets boven of onder een bepaalde drempel komt of wanneer je een indringer detecteert. U kunt veilige inlogsystemen bouwen met tweefactorauthenticatie, een WhatsApp-chatbot bouwen en een afspraakherinneringssysteem.
Afgezien hiervan kunt u het gebruiken voor telefoonnummerverificatie, marketingcampagnes, het verzenden van enquêtes en het verzamelen van feedback. Houd bij het bouwen van een applicatie altijd rekening met de prijzen van de Twilio API om onverwachte kosten te voorkomen.