Sukurkite ir paleiskite OTP patvirtinimo sistemą savo Python programoje naudodamiesi šiuo vadovu.

Net jei jūsų slaptažodis būtų pavogtas, OTP patvirtinimo sistemos yra esminis saugumo veiksnys. Tai pašalina poreikį atsiminti slaptažodžius, yra papildomas saugumo sluoksnis ir sumažina sukčiavimo riziką.

Išmokite sukurti vienkartinio slaptažodžio patvirtinimo sistemą naudodami Python, kuri siunčia jums vienkartinį slaptažodį į jūsų mobiliojo telefono numerį galioja tik dvi minutes, o paskyra bus užrakinta, jei tris kartus įvesite neteisingą vienkartinį kodą į a eilė.

Įdiekite „Tkinter“, „Twilio“ ir atsitiktinius modulius

Tkinter leidžia jums kurti darbalaukio programas. Jame siūlomi įvairūs valdikliai, pvz., mygtukai, etiketės ir teksto laukeliai, kurie palengvina programų kūrimą.

Twilio modulis jums padės integruoti komunikacijos funkcijas, tokias kaip SMS, MMS, telefono skambučiai ir patvirtinimas tiesiai į programą. Jame yra debesies pagrindu sukurta infrastruktūra ir nuostabios funkcijos, pvz., numerių teikimas, pranešimų šablonai ir skambučių įrašymas.

Norėdami įdiegti „Twilio“ ir „Tkinter“ modulius, terminale paleiskite šią komandą:

pip install twilio tk

Atsitiktinis modulis yra įmontuotas Python modulis, naudojamas pseudoatsitiktiniams skaičiams generuoti. Taip galite generuoti atsitiktinius skaičius, pasirinkti atsitiktinius sąrašo elementus, maišyti sąrašo turinį ir dar daugiau. Galite naudoti jį kurdami kauliukų metimo modeliavimą, sąrašo maišytuvą arba a atsitiktinių slaptažodžių generatorius.

Sugeneruokite „Twilio“ API ir gaukite telefono numerį

Jei norite naudoti „Twilio“ ir siųsti vienkartines užklausas į savo mobilųjį telefoną, jums reikia autentifikavimo kredencialų ir „Twilio“ telefono numerio. Norėdami tai pasiekti:

  1. Prisiregistruokite gauti „Twilio“ paskyrą ir apsilankykite Twilio konsolė.
  2. Slinkite žemyn ir spustelėkite Gaukite telefono numerį mygtuką. Nukopijuokite sugeneruotą telefono numerį.
  3. Slinkite žemyn iki Sąskaitos info skyrius. Nukopijuokite Paskyros SID ir Auth Token.

Programos struktūros kūrimas

Čia galite rasti visą OTP patvirtinimo sistemos kūrimo šaltinio kodą naudojant Python GitHub saugykla.

Importuokite reikiamus modulius ir nustatykite autentifikavimo kredencialus. Inicijuokite „Twilio“ klientą, kad galėtumėte autentifikuoti ir būti API skambučių įvesties tašku. Nustatykite galiojimo laiką iki dviejų minučių.

Apibrėžkite klasę, Vienkartinis patvirtinimas, ir inicijuokite konstruktorių, kad nustatytumėte numatytąsias kintamųjų reikšmes kartu su šakninio lango inicijavimu ir programos pavadinimo bei matmenų nustatymu.

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

Apibrėžkite tris etiketes, kad paprašytumėte mobiliojo telefono numerio ir vienkartinio slaptažodžio bei būtų rodomas laikmatis, kai programa išsiųs vienkartinį pranešimą. Nustatykite pirminį elementą, tekstą, kurį jis turi rodyti, ir šrifto stilius, kuriuos jis turėtų turėti. Panašiai sukurkite du įvesties valdiklius, kad gautumėte įvestį iš vartotojo. Nustatykite pirminį elementą, plotį ir šrifto stilius.

Sukurkite tris mygtukus, kad siųstumėte OTP, iš naujo išsiųstumėte OTP ir Patvirtinkite OTP. Nustatykite pirminį elementą, tekstą, kurį jis turi rodyti, komandą, kurią ji turi vykdyti spustelėjus, ir šrifto stilius. Sutvarkykite šiuos elementus naudodami paketas metodas.

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

Programos funkcionalumo kūrimas

Apibrėžkite metodą, start_timer() kad bėga timer_countdown atskiroje gijoje.

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

Apibrėžkite metodą, timer_countdown(). Įrašykite pradžios laiką ir paleiskite begalinę ciklą, kuris paima esamą laiką ir apskaičiuoja praėjusį bei likusį laiką. Jeigu stop_timer tiesa, nutraukite kilpą. Jei likęs laikas yra mažesnis arba lygus nuliui, parodykite klaidos pranešimo laukelį, kuriame sakoma, kad OTP galiojimo laikas baigėsi.

Suaktyvinkite pakartotinio vienkartinio slaptažodžio siuntimo mygtuką, nustatykite OTP į None ir nutraukite. Kitu atveju apskaičiuokite likusias minutes ir sekundes, parodykite jas laikmačio etiketėje ir vieną sekundę miegokite.

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)

Apibrėžkite metodą, send_otp(). Jeigu užrakinta yra tiesa, parodykite atitinkamą pranešimą. Kitu atveju išskleiskite telefono numerį, patvirtinkite jį ir sugeneruokite atsitiktinį vienkartinį kodą. Perduokite anksčiau įsigytą mobilųjį telefoną ir naudokite klientą, kad išsiųstumėte OTP į savo telefono numerį. Parodykite pranešimų laukelį, paleiskite laikmatį, išjunkite mygtukus ir visiškai išvalykite įrašą.

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)

Apibrėžkite metodą, resend_otp(). Jei užrakinta, parodykite atitinkamą pranešimą. Kitu atveju gaukite telefono numerį, patvirtinkite jį, iš naujo sukurkite atsitiktinį vienkartinį protokolą, iš naujo išsiųskite vienkartinį pranešimą, parodykite pranešimų laukelį, paleiskite laikmatį ir išjunkite pakartotinio vienkartinio pašto siuntimo mygtuką.

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)

Apibrėžkite metodą, verify_otp(). Gaukite OTP ir patikrinkite, ar vartotojas nieko neįvedė. Jei saugomas OTP yra Nė vienas, paprašykite vartotojo pirmiausia sugeneruoti OTP. Jei vartotojo įvestas vienkartinis slaptažodis sutampa su išsaugotu, parodykite sėkmingo vienkartinio pašto patvirtinimo pranešimą, sustabdykite laikmatį ir išeikite iš programos. Priešingu atveju patikrinkite, ar nėra klaidingų bandymų. Jei neteisingų bandymų skaičius viršija tris, užrakinkite paskyrą.

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

Apibrėžkite metodą, lock_account (). Nustatykite užrakinimo būseną į teisingą ir parodykite etiketę kaip Paskyra užrakinta. Išjungti visas etiketes, įrašus ir mygtukus. Sustabdykite esamą laikmatį ir dešimt minučių paleiskite naują.

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)

Apibrėžkite metodą start_countdown(). Jei likęs laikas yra mažesnis arba lygus nuliui, iš naujo nustatykite paskyrą. Kitu atveju parodykite, kad programa užrakino paskyrą, ir bandykite dar kartą per likusį laiką naudodami atgalinį skambutį.

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)

Apibrėžkite funkciją, Reset_account(). Iš naujo nustatykite visų valdiklių ir kintamųjų būseną, kaip anksčiau.

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

Sukurkite šakninį langą, klasės egzempliorių ir paleiskite programą „Tkinter“.

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

Patvirtinimo naudojant OTP išvesties pavyzdys

Paleidus OTP patvirtinimo programą, pamatysite langą, kuriame prašoma įvesti savo mobiliojo telefono numerį. Įveskite jį kartu su savo šalies kodu ir paspauskite Siųsti OTP mygtuką. Gaunate pranešimą, kad programa sėkmingai išsiuntė OTP ir mygtukas išjungiamas dviem minutėms. Patikrinkite, ar telefone nėra OTP, ir įveskite jį prieš pasibaigiant jo galiojimo laikui.

Įvedę teisingą vienkartinį slaptažodį, kol nesibaigs laikmatis, gausite pranešimą, kad programa sėkmingai patikrino vienkartinį slaptažodžius, ir programa išeina. Jei neįvedėte jo laiku, gausite pranešimo laukelį, kuriame bus nurodyta, kad OTP galiojimo laikas baigėsi. Galite spustelėti Iš naujo siųsti OTP mygtuką, kad sugeneruotumėte naują vienkartinį kodą ir išsiųstumėte jį į savo telefoną.

Jei įvesite neteisingą OTP, programa parodys pranešimų laukelį OTP nesutampa.

Jei tris kartus įvesite neteisingą OTP, visi laukai bus išjungti, o paskyra užrakinama dešimčiai minučių.

„Twilio“ naudojimas su „Python“.

Naudodami „Twilio“ galite sukurti SMS pranešimų apie įvairius įvykius sistemą. Galite naudoti jį su daiktų interneto įrenginiais, kad suaktyvintumėte SMS, kai kažkas nukrenta virš arba žemiau tam tikros ribos arba kai aptinkate įsibrovėlį. Galite sukurti saugias prisijungimo sistemas su dviejų veiksnių autentifikavimu, sukurti WhatsApp pokalbių robotą ir susitikimo priminimo sistemą.

Be to, galite jį naudoti telefono numerių patvirtinimui, rinkodaros kampanijoms, apklausų siuntimui ir atsiliepimų rinkimui. Kurdami bet kokią programą, visada atkreipkite dėmesį į „Twilio“ API kainodarą, kad išvengtumėte netikėtų išlaidų.