Z pomocą tego przewodnika skonfiguruj i uruchom system weryfikacji OTP w swojej aplikacji w języku Python.

Nawet jeśli Twoje hasło zostanie skradzione, systemy weryfikacji OTP stanowią kluczowy czynnik bezpieczeństwa. Eliminuje konieczność zapamiętywania haseł, stanowi dodatkową warstwę bezpieczeństwa i zmniejsza ryzyko phishingu.

Naucz się budować system weryfikacji OTP za pomocą Pythona, który wysyła OTP na Twój numer telefonu komórkowego ważny tylko przez dwie minuty, a Twoje konto zostanie zablokowane, jeśli trzykrotnie wprowadzisz niewłaściwy OTP w ciągu jednego dnia wiersz.

Zainstaluj moduły Tkinter, Twilio i Random

Tkinter ci na to pozwala tworzyć aplikacje desktopowe. Oferuje różnorodne widżety, takie jak przyciski, etykiety i pola tekstowe, które ułatwiają tworzenie aplikacji.

Moduł Twilio Ci w tym pomoże zintegrować funkcje komunikacyjne, takie jak SMS, MMS-y, rozmowy telefoniczne i weryfikacja bezpośrednio w Twojej aplikacji. Ma infrastrukturę opartą na chmurze wraz z niesamowitymi funkcjami, takimi jak udostępnianie numerów, szablony wiadomości i nagrywanie rozmów.

instagram viewer

Aby zainstalować moduły Twilio i Tkinter, uruchom następujące polecenie w terminalu:

pip install twilio tk

Moduł Random to wbudowany moduł Pythona służący do generowania liczb pseudolosowych. Dzięki temu możesz generować losowe liczby, wybierać losowe elementy z listy, tasować zawartość listy i nie tylko. Możesz go użyć do zbudowania symulacji rzutu kostką, tasowania list lub generator losowych haseł.

Wygeneruj interfejs API usługi Twilio i uzyskaj numer telefonu

Aby korzystać z Twilio i wysyłać żądania OTP na swój telefon komórkowy, potrzebujesz poświadczeń uwierzytelniających wraz z numerem telefonu Twilio. Osiągnąć to:

  1. Zarejestruj konto Twilio i odwiedź stronę Konsola Twilio.
  2. Przewiń w dół i kliknij na Uzyskaj numer telefonu przycisk. Skopiuj wygenerowany numer telefonu.
  3. Przewiń w dół do Informacje o koncie Sekcja. Skopiuj Identyfikator konta i Token autoryzacji.

Budowanie struktury aplikacji

Możesz znaleźć cały kod źródłowy do budowy systemu weryfikacji OTP przy użyciu Pythona w tym Repozytorium GitHub.

Zaimportuj niezbędne moduły i ustaw dane uwierzytelniające. Zainicjuj klienta Twilio, aby uwierzytelniał się i był punktem wejścia dla wywołań interfejsu API. Ustaw czas wygaśnięcia na dwie minuty.

Zdefiniuj klasę, Weryfikacja OTP, i zainicjuj konstruktora, aby ustawić domyślne wartości zmiennych wraz z inicjalizacją okna głównego oraz ustawieniem tytułu i wymiarów aplikacji.

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

Zdefiniuj trzy etykiety, aby poprosić o numer telefonu komórkowego i hasło jednorazowe oraz wyświetlić licznik czasu po wysłaniu przez program hasła jednorazowego. Ustaw element nadrzędny, tekst, który ma wyświetlać, oraz style czcionek, które powinien posiadać. Podobnie utwórz dwa widżety wpisów, aby uzyskać dane wejściowe od użytkownika. Ustaw jego element nadrzędny, jego szerokość i style czcionek.

Utwórz trzy przyciski do wysyłania hasła jednorazowego, ponownego wysyłania hasła jednorazowego i weryfikacji hasła jednorazowego. Ustaw jego element nadrzędny, tekst, który ma wyświetlać, polecenie, które ma wykonać po kliknięciu, oraz style czcionek. Uporządkuj te elementy za pomocą Pakiet metoda.

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

Budowanie funkcjonalności aplikacji

Zdefiniuj metodę, start_timer() to działa timer_countdown w osobnym wątku.

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

Zdefiniuj metodę, timer_countdown(). Zapisz czas rozpoczęcia i uruchom nieskończoną pętlę, która pobiera bieżący czas i oblicza czas, który upłynął i pozostały. Jeśli stop_timer jest prawdą, zakończ pętlę. Jeśli pozostały czas jest mniejszy lub równy zeru, wyświetl okno komunikatu o błędzie informujące o wygaśnięciu jednorazowego hasła jednorazowego użytku.

Aktywuj przycisk ponownego wysłania hasła jednorazowego, ustaw brak hasła jednorazowego i zakończ. W przeciwnym razie oblicz pozostałe minuty i sekundy, wyświetl je na etykiecie timera i śpij przez jedną 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)

Zdefiniuj metodę, wyślij_otp(). Jeśli zablokowany jest prawdziwy, wyświetl odpowiedni komunikat. W przeciwnym razie wyodrębnij numer telefonu, potwierdź go i wygeneruj losowe hasło jednorazowe. Podaj otrzymany wcześniej telefon komórkowy i użyj klienta, aby wysłać hasło jednorazowe na swój numer telefonu. Wyświetl okno komunikatu, uruchom stoper, wyłącz przyciski i całkowicie wyczyść wpis.

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)

Zdefiniuj metodę, wyślij ponownie_otp(). Jeśli jest zablokowany, wyświetl odpowiedni komunikat. W przeciwnym razie uzyskaj numer telefonu, potwierdź go, ponownie wygeneruj losowe hasło jednorazowe, wyślij ponownie hasło jednorazowe, wyświetl okno wiadomości, uruchom stoper i wyłącz przycisk ponownego wysłania hasła jednorazowego.

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)

Zdefiniuj metodę, weryfikuj_otp(). Pobierz OTP i sprawdź, czy użytkownik niczego nie wprowadził. Jeśli przechowywane hasło jednorazowe jest Nic, poproś użytkownika, aby najpierw wygenerował hasło jednorazowe. Jeśli hasło jednorazowe wprowadzone przez użytkownika jest zgodne z zapisanym, wyświetl komunikat o pomyślnej weryfikacji hasła jednorazowego, zatrzymaj stoper i zamknij program. W przeciwnym razie sprawdź, czy nie ma błędnych prób. Jeśli liczba błędnych prób przekroczy trzy, zablokuj konto.

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

Zdefiniuj metodę, zablokować konto(). Ustaw status blokady na true i wyświetl etykietę jako Konto zablokowane. Wyłącz wszystkie etykiety, wpisy i przyciski. Zatrzymaj istniejący stoper i uruchom nowy na dziesięć minut.

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)

Zdefiniuj metodę start_countdown(). Jeśli pozostały czas jest mniejszy lub równy zeru, zresetuj konto. W przeciwnym razie wyświetl, że program zablokował konto i spróbuj ponownie w pozostałym czasie, korzystając z wywołania zwrotnego.

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)

Zdefiniuj funkcję, reset_konta(). Zresetuj stan wszystkich widżetów i zmiennych jak poprzednio.

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

Utwórz okno główne, instancję klasy i uruchom aplikację Tkinter.

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

Przykładowy wynik weryfikacji przy użyciu OTP

Po uruchomieniu programu weryfikacji OTP pojawi się okno z prośbą o wprowadzenie numeru telefonu komórkowego. Wprowadź go wraz z kodem kraju i naciśnij Wyślij hasło jednorazowe przycisk. Pojawi się komunikat, że program pomyślnie wysłał hasło jednorazowe, a przycisk dezaktywuje się na dwie minuty. Sprawdź swój telefon pod kątem hasła jednorazowego i wprowadź go, zanim wygaśnie.

Po wprowadzeniu poprawnego hasła jednorazowego przed upływem czasu wyświetlany jest komunikat, że program pomyślnie zweryfikował hasło jednorazowe, i program zostaje zakończony. Jeśli nie wprowadziłeś go na czas, pojawi się komunikat informujący, że hasło jednorazowe wygasło. Możesz kliknąć na Wyślij ponownie hasło jednorazowe przycisk, aby wygenerować nowe hasło jednorazowe i wysłać je na swój telefon.

Jeśli wpiszesz niewłaściwy OTP, program wyświetli okno komunikatu z informacją OTP nie pasuje.

Jeśli trzykrotnie wpiszesz niewłaściwy OTP, wszystkie pola zostaną wyłączone, a konto zostanie zablokowane na dziesięć minut.

Używanie Twilio z Pythonem

Korzystając z Twilio, możesz zbudować system powiadomień SMS o różnych wydarzeniach. Możesz go używać z urządzeniami IoT do wyzwalania wiadomości SMS, gdy coś spadnie powyżej lub poniżej określonego progu lub gdy wykryjesz intruza. Możesz zbudować bezpieczne systemy logowania z uwierzytelnianiem dwuskładnikowym, zbudować chatbota WhatsApp i system przypomnień o spotkaniach.

Oprócz tego możesz go używać do weryfikacji numeru telefonu, kampanii marketingowych, wysyłania ankiet i zbierania opinii. Tworząc dowolną aplikację, zawsze pamiętaj o cenach interfejsu API usługi Twilio, aby uniknąć nieoczekiwanych kosztów.