Izmantojot šo rokasgrāmatu, savā Python lietojumprogrammā izveidojiet un iedarbiniet OTP verifikācijas sistēmu.

Pat ja jūsu parole tiek nozagta, OTP verifikācijas sistēmas ir būtisks drošības faktors. Tas novērš nepieciešamību atcerēties paroles, kalpo kā papildu drošības slānis un samazina pikšķerēšanas risku.

Uzziniet, kā izveidot OTP verifikācijas sistēmu, izmantojot Python, kas nosūta jums OTP uz jūsu mobilā tālruņa numuru ir derīga tikai divas minūtes, un jūsu konts tiek bloķēts, ja trīs reizes ievadāt nepareizu OTP laukā a rinda.

Instalējiet Tkinter, Twilio un Random moduļus

Tkinter ļauj jums izveidot darbvirsmas lietojumprogrammas. Tas piedāvā dažādus logrīkus, piemēram, pogas, etiķetes un tekstlodziņus, kas atvieglo lietojumprogrammu izstrādi.

Twilio modulis jums palīdz integrēt saziņas funkcijas, piemēram, SMS, MMS, tālruņa zvani un verifikācija tieši savā lietojumprogrammā. Tam ir uz mākoņiem balstīta infrastruktūra, kā arī pārsteidzošas funkcijas, piemēram, numuru nodrošināšana, ziņojumu veidnes un zvanu ierakstīšana.

instagram viewer

Lai instalētu Twilio un Tkinter moduļus, terminālī palaidiet šādu komandu:

pip install twilio tk

Nejaušais modulis ir iebūvēts Python modulis, ko izmanto pseidogadījuma skaitļu ģenerēšanai. Izmantojot to, varat ģenerēt nejaušus skaitļus, izvēlēties nejaušus elementus no saraksta, jaukt saraksta saturu un veikt citas darbības. Varat to izmantot, lai izveidotu kauliņu mešanas simulāciju, sarakstu jaukšanas ierīci vai a izlases paroļu ģenerators.

Ģenerējiet Twilio API un iegūstiet tālruņa numuru

Lai izmantotu Twilio un nosūtītu OTP pieprasījumus uz savu mobilo tālruni, ir nepieciešami autentifikācijas akreditācijas dati, kā arī Twilio tālruņa numurs. Lai to sasniegtu:

  1. Reģistrējieties Twilio kontam un apmeklējiet Twilio konsole.
  2. Ritiniet uz leju un noklikšķiniet uz Iegūstiet tālruņa numuru pogu. Kopējiet izveidoto tālruņa numuru.
  3. Ritiniet uz leju līdz Konta informācija sadaļā. Kopējiet Konta SID un Auth Token.

Lietojumprogrammas struktūras izveide

Šeit varat atrast visu avota kodu OTP verifikācijas sistēmas izveidei, izmantojot Python GitHub repozitorijs.

Importējiet nepieciešamos moduļus un iestatiet autentifikācijas akreditācijas datus. Inicializējiet Twilio klientu, lai tā autentificētos un kļūtu par API izsaukumu ieejas punktu. Iestatiet derīguma termiņu uz divām minūtēm.

Definējiet klasi, OTP verifikācija, un inicializējiet konstruktoru, lai iestatītu mainīgo noklusējuma vērtības kopā ar saknes loga inicializāciju un lietojumprogrammas nosaukuma un dimensiju iestatīšanu.

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

Definējiet trīs iezīmes, lai pieprasītu mobilā tālruņa numuru un OTP, kā arī parādītu taimeri pēc tam, kad programma nosūta OTP. Iestatiet vecākelementu, tekstu, kas tam jāparāda, un fontu stilus, kuriem tam vajadzētu būt. Līdzīgi izveidojiet divus ievades logrīkus, lai saņemtu ievadi no lietotāja. Iestatiet tā vecākelementu, platumu un fontu stilus.

Izveidojiet trīs pogas, lai nosūtītu OTP, atkārtoti nosūtītu OTP un Verify OTP. Iestatiet tā vecākelementu, tekstu, kas tam jāparāda, komandu, kas jāizpilda, noklikšķinot, un tā fontu stilus. Sakārtojiet šos elementus, izmantojot komplekts metodi.

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

Lietojumprogrammas funkcionalitātes veidošana

Definējiet metodi, start_timer() kas skrien timer_countdown atsevišķā pavedienā.

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

Definējiet metodi, timer_countdown(). Ierakstiet sākuma laiku un palaidiet bezgalīgu ciklu, kas ņem pašreizējo laiku un aprēķina pagājušo un atlikušo laiku. Ja stop_taimer ir taisnība, pārtrauciet cilpu. Ja atlikušais laiks ir mazāks vai vienāds ar nulli, parādiet kļūdas ziņojuma lodziņu, kurā teikts, ka OTP derīguma termiņš ir beidzies.

Aktivizējiet pogu Atkārtoti sūtīt OTP, iestatiet OTP uz None un pārtrauciet darbību. Pretējā gadījumā aprēķiniet atlikušās minūtes un sekundes, parādiet to uz taimera etiķetes un pagulējiet vienu sekundi.

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)

Definējiet metodi, send_otp(). Ja bloķēta ir patiess, parādiet atbilstošo ziņojumu. Pretējā gadījumā izņemiet tālruņa numuru, apstipriniet to un ģenerējiet nejaušu OTP. Nododiet iepriekš iegūto mobilo tālruni un izmantojiet klientu, lai nosūtītu OTP uz jūsu tālruņa numuru. Parādiet ziņojumu lodziņu, palaidiet taimeri, atspējojiet pogas un pilnībā notīriet ierakstu.

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)

Definējiet metodi, resend_otp(). Ja tas ir bloķēts, parādiet atbilstošo ziņojumu. Pretējā gadījumā iegūstiet tālruņa numuru, apstipriniet to, ģenerējiet nejaušu vienreizēju protokolu, atkārtoti nosūtiet OTP, parādiet ziņojuma lodziņu, palaidiet taimeri un atspējojiet atkārtotas OTP sūtīšanas pogu.

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)

Definējiet metodi, verify_otp(). Iegūstiet OTP un pārbaudiet, vai lietotājs neko nav ievadījis. Ja saglabātais OTP ir Nav, lūdziet lietotājam vispirms ģenerēt OTP. Ja lietotāja ievadītā OTP atbilst saglabātajai, parādiet veiksmīgo OTP verifikācijas ziņojumu, apturiet taimeri un izejiet no programmas. Pretējā gadījumā pārbaudiet, vai nav veikti nepareizi mēģinājumi. Ja nepareizo mēģinājumu skaits pārsniedz trīs, bloķējiet kontu.

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

Definējiet metodi, lock_account(). Iestatiet bloķēšanas statusu uz True un parādiet etiķeti kā Konts ir bloķēts. Atspējojiet visas etiķetes, ierakstus un pogas. Apturiet esošo taimeri un sāciet jaunu uz desmit minūtēm.

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)

Definējiet metodi start_countdown(). Ja atlikušais laiks ir mazāks vai vienāds ar nulli, atiestatiet kontu. Pretējā gadījumā parādiet, ka programma ir bloķējusi kontu, un atlikušajā laikā mēģiniet vēlreiz, izmantojot atzvanīšanu.

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)

Definējiet funkciju, reset_account(). Atiestatiet visu logrīku un mainīgo statusu tāpat kā iepriekš.

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

Izveidojiet saknes logu, klases gadījumu un palaidiet lietojumprogrammu Tkinter.

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

Piemērs verifikācijas izvadei, izmantojot OTP

Palaižot OTP verifikācijas programmu, tiek parādīts logs, kurā tiek prasīts ievadīt mobilā tālruņa numuru. Ievadiet to kopā ar valsts kodu un nospiediet Nosūtīt OTP pogu. Tiek parādīts ziņojums, ka programma ir veiksmīgi nosūtījusi OTP, un poga tiek deaktivizēta uz divām minūtēm. Pārbaudiet, vai tālrunī nav OTP, un ievadiet to, pirms beidzas tā derīguma termiņš.

Ievadot pareizo OTP, pirms taimeris ir beidzies, tiek parādīts ziņojums, ka programma ir veiksmīgi pārbaudījusi OTP, un programma iziet. Ja jūs to neievadījāt laikā, jūs saņemsit ziņojuma lodziņu, kurā teikts, ka OTP derīguma termiņš ir beidzies. Jūs varat noklikšķināt uz Atkārtoti sūtīt OTP pogu, lai ģenerētu jaunu OTP un nosūtītu to uz savu tālruni.

Ja ievadāt nepareizu OTP, programma parāda ziņojuma lodziņu, kurā teikts OTP neatbilst.

Ja trīs reizes ievadāt nepareizu OTP, visi lauki tiek atspējoti un konts tiek bloķēts uz desmit minūtēm.

Izmantojot Twilio ar Python

Izmantojot Twilio, varat izveidot SMS paziņojumu sistēmu dažādiem notikumiem. Varat to izmantot ar IoT ierīcēm, lai aktivizētu īsziņas, kad kaut kas nokrīt virs vai zem noteikta sliekšņa vai kad tiek atklāts iebrucējs. Varat izveidot drošas pieteikšanās sistēmas ar divu faktoru autentifikāciju, izveidot WhatsApp tērzēšanas robotu un tikšanās atgādinājuma sistēmu.

Papildus tam varat to izmantot tālruņa numura pārbaudei, mārketinga kampaņām, aptauju sūtīšanai un atsauksmju apkopošanai. Veidojot jebkuru lietojumprogrammu, vienmēr ievērojiet Twilio API cenas, lai izvairītos no neparedzētām izmaksām.