Få OTP-verifiseringssystemet i gang i Python-applikasjonen din ved hjelp av denne veiledningen.

Selv om passordet ditt blir stjålet, fungerer OTP-verifiseringssystemer som en avgjørende faktor for sikkerheten. Det eliminerer behovet for å huske passord, fungerer som et ekstra sikkerhetslag og reduserer risikoen for phishing.

Lær å bygge et OTP-verifiseringssystem ved hjelp av Python som sender deg en OTP til mobilnummeret ditt kun gyldig i to minutter og kontoen din blir låst hvis du angir feil OTP tre ganger i en rad.

Installer Tkinter-, Twilio- og Random-moduler

Tkinter lar deg lage skrivebordsapplikasjoner. Den tilbyr en rekke widgets som knapper, etiketter og tekstbokser som gjør det enklere å utvikle applikasjoner.

Twilio-modulen hjelper deg å integrere kommunikasjonsfunksjoner som SMS, MMS, telefonsamtaler og verifisering rett inn i applikasjonen din. Den har en skybasert infrastruktur sammen med fantastiske funksjoner som nummerlevering, meldingsmaler og samtaleopptak.

For å installere Twilio- og Tkinter-modulene, kjør følgende kommando i terminalen:

pip install twilio tk

Random-modulen er en innebygd Python-modul som brukes til å generere pseudo-tilfeldige tall. Med dette kan du generere tilfeldige tall, velge tilfeldige elementer fra en liste, blande innholdet i en liste og mer. Du kan bruke den til å bygge en terningkast-simulering, en liste-shuffler eller en tilfeldig passordgenerator.

Generer Twilio API og få et telefonnummer

For å bruke Twilio og sende OTP-forespørsler til mobiltelefonen din, trenger du autentiseringslegitimasjon sammen med et Twilio-telefonnummer. For å oppnå dette:

  1. Registrer deg for en Twilio-konto og besøk Twilio-konsoll.
  2. Rull ned og klikk på Få telefonnummer knapp. Kopier det genererte telefonnummeret.
  3. Rull ned til Kontoinformasjon seksjon. Kopier Konto SID og Auth Token.

Bygge strukturen til applikasjonen

Du kan finne hele kildekoden for å bygge et OTP-verifiseringssystem ved å bruke Python i denne GitHub-depot.

Importer de nødvendige modulene og angi autentiseringslegitimasjonen. Initialiser Twilio-klienten for å autentisere og være inngangspunktet for API-kall. Sett utløpstiden til to minutter.

Definer en klasse, OTP-verifisering, og initialiser konstruktøren for å angi standardverdiene for variabler sammen med initialisering av rotvinduet, og angi tittelen og dimensjonene til applikasjonen.

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 å be om et mobilnummer og en OTP, og for å vise en tidtaker etter at programmet sender en OTP. Angi det overordnede elementet, teksten det skal vise og skriftstilene det skal ha. På samme måte oppretter du to oppføringswidgeter for å få innspill fra brukeren. Angi det overordnede elementet, dets bredde og skriftstiler.

Opprett tre knapper for å sende OTP, sende OTP på nytt og Bekreft OTP. Angi det overordnede elementet, teksten det skal vise, kommandoen det skal utføre når det klikkes, og skriftstilene. Organiser disse elementene ved hjelp av 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()

Bygge funksjonaliteten til applikasjonen

Definer en metode, start_timer() som løper timer_nedtelling i en egen 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 kjør en uendelig sløyfe som tar gjeldende tid og beregner medgått og gjenværende tid. Hvis stop_timer er sant, avslutte sløyfen. Hvis den gjenværende tiden er mindre enn eller lik null, viser du en feilmeldingsboks som sier at OTP er utløpt.

Aktiver på nytt OTP-knappen, sett OTP til ingen, og avslutt. Ellers beregner du gjenværende minutter og sekunder, viser det på tidtakeretiketten og sover i ett 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 sant, vis den aktuelle meldingen. Ellers, trekk ut telefonnummeret, valider det og generer en tilfeldig OTP. Pass på mobiltelefonen du fikk tidligere og bruk klienten til å sende engangskoden til telefonnummeret ditt. Vis en meldingsboks, start tidtakeren, deaktiver knappene og slett oppføringen 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, send_otp(). Vis den aktuelle meldingen hvis den er låst. Ellers kan du få telefonnummeret, validere det, regenerere en tilfeldig OTP, sende OTP på nytt, vise meldingsboksen, starte tidtakeren og deaktivere send OTP-knappen på nytt.

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(). Få OTP, og sjekk om brukeren ikke har skrevet inn noe. Hvis den lagrede OTP er Ingen, spør brukeren om å generere OTP først. Hvis OTP-en brukeren skrev inn samsvarer med den lagrede, viser du den vellykkede OTP-verifiseringsmeldingen, stopper tidtakeren og avslutter programmet. Ellers må du se etter feil forsøk. Hvis feil forsøk 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(). Sett låst status til sann og vis etiketten som Konto låst. Deaktiver alle etiketter, oppføringer og knapper. Stopp den eksisterende timeren 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 gjenværende tiden er mindre enn eller lik null, tilbakestill kontoen. Hvis ikke, vis at programmet har låst kontoen og prøv igjen i den gjenværende tiden ved hjelp av en tilbakeringing.

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 funksjon, reset_account(). Tilbakestill statusen til alle widgetene og variablene 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

Opprett rotvinduet, en forekomst av klassen, og kjør Tkinter-applikasjonen.

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

Eksempel på verifisering ved bruk av OTP

Når du kjører OTP-verifiseringsprogrammet, får du et vindu som ber deg angi mobilnummeret ditt. Skriv inn den sammen med landskoden din og trykk på Send OTP knapp. Du får en melding om at programmet har sendt OTP vellykket og knappen deaktiveres i to minutter. Sjekk telefonen din for OTP og skriv den inn før den utløper.

Når du angir riktig OTP før timeren går ut, får du en melding om at programmet har verifisert OTP vellykket, og programmet avsluttes. I tilfelle du ikke skrev inn det i tide, vil du få en meldingsboks som sier at OTP er utløpt. Du kan klikke på Send OTP på nytt for å generere en ny OTP og sende den til telefonen.

Hvis du angir feil OTP, viser programmet en meldingsboks som sier OTP stemmer ikke overens.

Hvis du skriver inn feil OTP tre ganger, blir alle feltene deaktivert og kontoen låses i ti minutter.

Bruke Twilio med Python

Ved å bruke Twilio kan du bygge et SMS-varslingssystem for ulike arrangementer. Du kan bruke den med IoT-enheter for å utløse SMS når noe faller over eller under en viss terskel eller når du oppdager en inntrenger. Du kan bygge sikre påloggingssystemer med tofaktorautentisering, bygge en WhatsApp chatbot og et avtalepåminnelsessystem.

Bortsett fra dette kan du bruke det til verifisering av telefonnummer, markedsføringskampanjer, sending av spørreundersøkelser og innsamling av tilbakemeldinger. Mens du bygger en applikasjon, vær alltid oppmerksom på Twilio API-priser for å unngå uventede kostnader.