Få OTP-bekræftelsessystemet op at køre i din Python-applikation ved hjælp af denne vejledning.

Selvom din adgangskode bliver stjålet, fungerer OTP-bekræftelsessystemer som en afgørende faktor for sikkerheden. Det eliminerer behovet for at huske adgangskoder, fungerer som et ekstra sikkerhedslag og reducerer risikoen for phishing.

Lær at bygge et OTP-verifikationssystem ved hjælp af Python, der sender dig en OTP til dit mobilnummer kun gyldig i to minutter, og din konto bliver låst, hvis du indtaster den forkerte OTP tre gange i en række.

Installer Tkinter-, Twilio- og Random-moduler

Tkinter giver dig mulighed for oprette desktop-applikationer. Det tilbyder en række widgets som knapper, etiketter og tekstbokse, der gør det nemmere at udvikle applikationer.

Twilio modul hjælper dig med at integrere kommunikationsfunktioner som SMS, MMS, telefonopkald og bekræftelse direkte ind i din applikation. Det har en cloud-baseret infrastruktur sammen med fantastiske funktioner såsom nummerlevering, beskedskabeloner og opkaldsoptagelse.

instagram viewer

For at installere Twilio- og Tkinter-modulerne skal du køre følgende kommando i terminalen:

pip install twilio tk

Random-modulet er et indbygget Python-modul, der bruges til at generere pseudo-tilfældige tal. Med dette kan du generere tilfældige tal, vælge tilfældige elementer fra en liste, blande indholdet af en liste og mere. Du kan bruge den til at bygge en terningkast-simulering, en liste-shuffler eller en tilfældig adgangskodegenerator.

Generer Twilio API og få et telefonnummer

For at bruge Twilio og sende OTP-anmodninger til din mobiltelefon skal du have godkendelsesoplysninger sammen med et Twilio-telefonnummer. For at opnå dette:

  1. Tilmeld dig en Twilio-konto og besøg Twilio konsol.
  2. Rul ned og klik på Få telefonnummer knap. Kopiér det genererede telefonnummer.
  3. Rul ned til Kontooplysninger afsnit. Kopier Konto SID og Auth Token.

Opbygning af applikationens struktur

Du kan finde hele kildekoden til at bygge et OTP-verifikationssystem ved hjælp af Python i denne GitHub-depot.

Importer de nødvendige moduler, og indstil godkendelsesoplysningerne. Initialiser Twilio-klienten for at godkende og være indgangspunktet for API-kald. Indstil udløbstiden til to minutter.

Definer en klasse, OTP-bekræftelse, og initialiser konstruktøren for at indstille standardværdierne for variabler sammen med initialisering af rodvinduet og indstilling af titlen og dimensionerne for applikationen.

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

Definer tre etiketter for at bede om et mobilnummer og en OTP, og for at vise en timer, efter at programmet har sendt en OTP. Indstil det overordnede element, den tekst, det skal vise, og de skrifttyper, det skal have. På samme måde skal du oprette to indgangswidgets for at få input fra brugeren. Indstil dets overordnede element, dets bredde og dets skrifttypestile.

Opret tre knapper til at sende OTP, sende OTP igen og Bekræft OTP. Indstil dets overordnede element, den tekst, det skal vise, den kommando, det skal udføre, når der klikkes på det, og dets skrifttypestile. Organiser disse elementer ved hjælp af pakke metode.

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

Opbygning af applikationens funktionalitet

Definer en metode, start_timer() der kører timer_nedtælling i en særskilt tråd.

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

Definer en metode, timer_countdown(). Registrer starttiden og kør en uendelig sløjfe, der tager den aktuelle tid og beregner den forløbne og resterende tid. Hvis stop_timer er sandt, skal du afslutte løkken. Hvis den resterende tid er mindre end eller lig med nul, skal du vise en fejlmeddelelsesboks, der siger, at OTP er udløbet.

Aktiver gensend OTP-knappen, indstil OTP til ingen, og afslut. Ellers skal du beregne de resterende minutter og sekunder, vise det på timeretiketten og sove i et sekund.

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)

Definer en metode, send_otp(). Hvis Låst er sandt, skal du vise den relevante meddelelse. Ellers skal du udtrække telefonnummeret, validere det og generere en tilfældig OTP. Send den mobiltelefon, du fik tidligere, og brug klienten til at sende OTP til dit telefonnummer. Vis en beskedboks, start timeren, deaktiver knapperne, og ryd indtastningen helt.

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)

Definer en metode, gensend_otp(). Vis den relevante meddelelse, hvis den er låst. Ellers skal du hente telefonnummeret, validere det, genskabe en tilfældig OTP, sende OTP'en igen, vise meddelelsesboksen, starte timeren og deaktivere gensend OTP-knappen.

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)

Definer en metode, verify_otp(). Hent OTP'en, og tjek om brugeren ikke har indtastet noget. Hvis den lagrede OTP er Ingen, bede brugeren om at generere OTP først. Hvis den OTP, som brugeren indtastede, matcher den gemte, skal du vise den succesfulde OTP-bekræftelse, stoppe timeren og afslutte programmet. Ellers skal du kontrollere for forkerte forsøg. Hvis de forkerte forsøg overstiger tre, lås kontoen.

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

Definer en metode, lock_account(). Indstil låst status til sand, og vis etiketten som Konto låst. Deaktiver alle etiketter, poster og knapper. Stop den eksisterende timer og start en ny i ti minutter.

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)

Definer en metode start_countdown(). Hvis den resterende tid er mindre end eller lig med nul, skal du nulstille kontoen. Ellers skal du vise, at programmet har låst kontoen, og prøve igen i den resterende tid ved hjælp af et tilbagekald.

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)

Definer en funktion, nulstil_konto(). Nulstil status for alle widgets og variabler som før.

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

Opret rodvinduet, en forekomst af klassen, og kør Tkinter-applikationen.

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

Eksempel output af verifikation ved hjælp af OTP

Når du kører OTP-verifikationsprogrammet, får du et vindue, der beder dig indtaste dit mobilnummer. Indtast det sammen med din landekode og tryk på Send OTP knap. Du får en besked om, at programmet har sendt OTP'en med succes, og knappen deaktiveres i to minutter. Tjek din telefon for OTP, og indtast den, før den udløber.

Når du indtaster den korrekte OTP, før timeren løber ud, får du en besked om, at programmet har bekræftet OTP'en med succes, og programmet afsluttes. I tilfælde af at du ikke indtastede det til tiden, vil du få en beskedboks, der siger, at OTP er udløbet. Du kan klikke på Send OTP igen knappen for at generere en ny OTP og sende den til din telefon.

Hvis du indtaster den forkerte OTP, viser programmet en beskedboks, der siger OTP stemmer ikke overens.

Hvis du indtaster den forkerte OTP tre gange, bliver alle felterne deaktiveret, og kontoen bliver låst i ti minutter.

Brug af Twilio med Python

Ved hjælp af Twilio kan du bygge et SMS-notifikationssystem til forskellige begivenheder. Du kan bruge det med IoT-enheder til at udløse SMS, når noget falder over eller under en bestemt tærskel, eller når du opdager en ubuden gæst. Du kan bygge sikre login-systemer med to-faktor-autentificering, bygge en WhatsApp-chatbot og et system til påmindelse om aftaler.

Ud over dette kan du bruge det til bekræftelse af telefonnummer, marketingkampagner, afsendelse af undersøgelser og indsamling af feedback. Mens du bygger en applikation, skal du altid være opmærksom på Twilio API-priser for at undgå uventede omkostninger.