Ota OTP-vahvistusjärjestelmä käyttöön Python-sovelluksessasi tämän oppaan avulla.

Vaikka salasanasi varastetaan, OTP-varmennusjärjestelmät ovat tärkeä tekijä turvallisuuden kannalta. Se eliminoi tarpeen muistaa salasanoja, toimii ylimääräisenä suojakerroksena ja vähentää tietojenkalasteluriskiä.

Opi rakentamaan OTP-vahvistusjärjestelmä Pythonilla, joka lähettää sinulle OTP: n matkapuhelinnumeroosi voimassa vain kaksi minuuttia ja tilisi lukitaan, jos syötät väärän OTP: n kolme kertaa kohdassa a rivi.

Asenna Tkinter-, Twilio- ja Random-moduulit

Tkinter antaa sinulle mahdollisuuden luoda työpöytäsovelluksia. Se tarjoaa erilaisia ​​widgetejä, kuten painikkeita, tarroja ja tekstiruutuja, jotka helpottavat sovellusten kehittämistä.

Twilio-moduuli auttaa sinua integroida viestintätoiminnot, kuten tekstiviestit, MMS, puhelut ja vahvistus suoraan sovellukseesi. Siinä on pilvipohjainen infrastruktuuri sekä uskomattomia ominaisuuksia, kuten numeroiden hallinta, viestimallit ja puheluiden tallennus.

Asenna Twilio- ja Tkinter-moduulit suorittamalla seuraava komento päätteessä:

instagram viewer
pip install twilio tk

Random-moduuli on sisäänrakennettu Python-moduuli, jota käytetään pseudosatunnaislukujen luomiseen. Tämän avulla voit luoda satunnaislukuja, valita satunnaisia ​​elementtejä luettelosta, sekoittaa luettelon sisältöä ja paljon muuta. Voit käyttää sitä nostanheiton simulaation, listasekoittimen tai a satunnainen salasanageneraattori.

Luo Twilio API ja hanki puhelinnumero

Jotta voit käyttää Twilioa ja lähettää OTP-pyyntöjä matkapuhelimeesi, tarvitset todennustiedot sekä Twilio-puhelinnumeron. Tämän saavuttamiseksi:

  1. Luo Twilio-tili ja käy osoitteessa Twilio konsoli.
  2. Vieritä alas ja napsauta Hanki puhelinnumero -painiketta. Kopioi luotu puhelinnumero.
  3. Vieritä alas kohtaan Tilitiedot osio. Kopioi Tilin SID ja Auth Token.

Sovelluksen rakenteen rakentaminen

Löydät tästä koko lähdekoodin OTP-vahvistusjärjestelmän rakentamiseen Pythonilla GitHub-arkisto.

Tuo tarvittavat moduulit ja aseta todennustiedot. Alusta Twilio-asiakassovellus todentamaan ja olemaan API-kutsujen aloituspiste. Aseta vanhenemisajaksi kaksi minuuttia.

Määritä luokka, OTP-vahvistus, ja alusta konstruktori määrittämään muuttujien oletusarvot sekä alustamaan juuriikkuna ja asettamaan sovelluksen otsikko ja mitat.

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

Määritä kolme tunnistetta, joilla voit pyytää matkapuhelinnumeroa ja OTP: tä sekä näyttää ajastimen, kun ohjelma lähettää OTP: n. Aseta yläelementti, teksti, jonka sen tulee näyttää, ja kirjasintyylit, jotka sillä tulee olla. Luo samalla tavalla kaksi syöttöwidgetiä saadaksesi syötteitä käyttäjältä. Aseta sen pääelementti, leveys ja fonttityypit.

Luo kolme painiketta OTP: n lähettämiseksi, OTP: n uudelleenlähettämiseksi ja OTP: n vahvistamiseksi. Aseta sen pääelementti, teksti, jonka sen tulee näyttää, komento, joka sen tulee suorittaa napsautettaessa, ja sen kirjasintyylit. Järjestä nämä elementit käyttämällä pakkaus menetelmä.

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

Sovelluksen toiminnallisuuden rakentaminen

Määritä menetelmä, start_timer() joka juoksee timer_countdown erillisessä ketjussa.

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

Määritä menetelmä, timer_countdown(). Tallenna aloitusaika ja suorita loputon silmukka, joka ottaa nykyisen ajan ja laskee kuluneen ja jäljellä olevan ajan. Jos stop_timer on totta, lopeta silmukka. Jos jäljellä oleva aika on pienempi tai yhtä suuri kuin nolla, näytä virheilmoitusruutu, jossa sanotaan, että OTP on vanhentunut.

Aktivoi Lähetä OTP uudelleen -painike, aseta OTP-asetukseksi ei mitään ja lopeta. Muussa tapauksessa laske jäljellä olevat minuutit ja sekunnit, näytä se ajastimen tarrassa ja nuku yksi sekunti.

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)

Määritä menetelmä, send_otp(). Jos lukittu on totta, näytä asianmukainen viesti. Muussa tapauksessa poista puhelinnumero, vahvista se ja luo satunnainen OTP. Ohita aiemmin hankkimasi matkapuhelin ja käytä asiakasta lähettääksesi OTP puhelinnumeroosi. Näytä viestiruutu, käynnistä ajastin, poista painikkeet käytöstä ja tyhjennä merkintä kokonaan.

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)

Määritä menetelmä, resend_otp(). Jos se on lukittu, näytä asianmukainen viesti. Muussa tapauksessa hanki puhelinnumero, vahvista se, luo satunnainen OTP uudelleen, lähetä OTP uudelleen, näytä viestiruutu, käynnistä ajastin ja poista uudelleenlähetä OTP -painike käytöstä.

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)

Määritä menetelmä, verify_otp(). Hanki OTP ja tarkista, ettei käyttäjä ole syöttänyt mitään. Jos tallennettu OTP on Ei mitään, pyydä käyttäjää luomaan OTP ensin. Jos käyttäjän antama OTP vastaa tallennettua, näytä onnistunut OTP-vahvistusviesti, pysäytä ajastin ja poistu ohjelmasta. Muussa tapauksessa tarkista virheelliset yritykset. Jos virheellisiä yrityksiä on enemmän kuin kolme, lukitse tili.

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

Määritä menetelmä, lock_account(). Aseta lukittu tilaksi tosi ja näytä tarra muodossa Tili lukittu. Poista käytöstä kaikki tarrat, merkinnät ja painikkeet. Pysäytä nykyinen ajastin ja käynnistä uusi kymmenen minuutin ajaksi.

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)

Määrittele menetelmä start_countdown(). Jos jäljellä oleva aika on pienempi tai yhtä suuri kuin nolla, nollaa tili. Muussa tapauksessa näytä, että ohjelma on lukinnut tilin, ja yritä uudelleen jäljellä olevan ajan kuluttua takaisinsoitolla.

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)

Määritä funktio, reset_account(). Palauta kaikkien widgetien ja muuttujien tila kuten ennenkin.

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

Luo juuriikkuna, luokan esiintymä ja suorita Tkinter-sovellus.

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

Esimerkki OTP: tä käyttävästä vahvistuksesta

Kun suoritat OTP-vahvistusohjelman, näet ikkunan, jossa sinua pyydetään antamaan matkapuhelinnumerosi. Syötä se maakoodisi kanssa ja paina Lähetä OTP -painiketta. Saat viestin, että ohjelma on lähettänyt OTP: n onnistuneesti ja painike poistuu käytöstä kahdeksi minuutiksi. Tarkista puhelimesi OTP: n varalta ja kirjoita se ennen kuin se vanhenee.

Kun syötät oikean OTP: n ennen kuin ajastin loppuu, saat viestin, että ohjelma on vahvistanut OTP: n onnistuneesti, ja ohjelma poistuu. Jos et syöttänyt sitä ajoissa, saat viestiruudun, jossa sanotaan, että OTP on vanhentunut. Voit napsauttaa Lähetä OTP uudelleen -painiketta luodaksesi uuden OTP: n ja lähettääksesi sen puhelimeesi.

Jos syötät väärän OTP: n, ohjelma näyttää sanoman OTP ei täsmää.

Jos syötät väärän OTP: n kolme kertaa, kaikki kentät poistetaan käytöstä ja tili lukitaan kymmeneksi minuutiksi.

Twilion käyttö Pythonin kanssa

Twilion avulla voit rakentaa tekstiviesti-ilmoitusjärjestelmän erilaisiin tapahtumiin. Voit käyttää sitä IoT-laitteiden kanssa tekstiviestien käynnistämiseen, kun jokin putoaa tietyn kynnyksen ylä- tai alapuolelle tai kun havaitset tunkeilijan. Voit rakentaa suojattuja kirjautumisjärjestelmiä kaksivaiheisella todennuksen avulla, rakentaa WhatsApp-chatbotin ja tapaamismuistutusjärjestelmän.

Tämän lisäksi voit käyttää sitä puhelinnumeron vahvistamiseen, markkinointikampanjoihin, kyselyjen lähettämiseen ja palautteen keräämiseen. Kun rakennat mitä tahansa sovellusta, ota aina huomioon Twilio API -hinnoittelu odottamattomien kustannusten välttämiseksi.