Θέστε σε λειτουργία το σύστημα επαλήθευσης OTP στην εφαρμογή Python με τη βοήθεια αυτού του οδηγού.

Ακόμα κι αν κλαπεί ο κωδικός πρόσβασής σας, τα συστήματα επαλήθευσης OTP χρησιμεύουν ως κρίσιμος παράγοντας για την ασφάλεια. Εξαλείφει την ανάγκη απομνημόνευσης κωδικών πρόσβασης, χρησιμεύει ως ένα επιπλέον επίπεδο ασφάλειας και μειώνει τους κινδύνους phishing.

Μάθετε να δημιουργείτε ένα σύστημα επαλήθευσης OTP χρησιμοποιώντας Python που σας στέλνει ένα OTP στον αριθμό του κινητού σας, είναι ισχύει μόνο για δύο λεπτά και ο λογαριασμός σας κλειδώνεται εάν εισαγάγετε λάθος OTP τρεις φορές στο α σειρά.

Εγκαταστήστε τα Tkinter, Twilio και Random Modules

Το Tkinter σας επιτρέπει δημιουργία επιτραπέζιων εφαρμογών. Προσφέρει μια ποικιλία γραφικών στοιχείων όπως κουμπιά, ετικέτες και πλαίσια κειμένου που διευκολύνουν την ανάπτυξη εφαρμογών.

Η ενότητα Twilio σας βοηθά να ενσωματώνουν λειτουργίες επικοινωνίας όπως SMS, MMS, τηλεφωνικές κλήσεις και επαλήθευση απευθείας στην εφαρμογή σας. Διαθέτει υποδομή που βασίζεται σε σύννεφο μαζί με εκπληκτικές δυνατότητες, όπως παροχή αριθμών, πρότυπα μηνυμάτων και εγγραφή κλήσεων.

instagram viewer

Για να εγκαταστήσετε τις λειτουργικές μονάδες Twilio και Tkinter, εκτελέστε την ακόλουθη εντολή στο τερματικό:

pip install twilio tk

Η μονάδα Random είναι μια ενσωματωμένη λειτουργική μονάδα Python που χρησιμοποιείται για τη δημιουργία ψευδοτυχαίων αριθμών. Με αυτό, μπορείτε να δημιουργήσετε τυχαίους αριθμούς, να επιλέξετε τυχαία στοιχεία από μια λίστα, να ανακατέψετε τα περιεχόμενα μιας λίστας και πολλά άλλα. Μπορείτε να το χρησιμοποιήσετε για να δημιουργήσετε μια προσομοίωση ρολού μήτρας, έναν ανακάτεμα λίστας ή α γεννήτρια τυχαίων κωδικών πρόσβασης.

Δημιουργήστε το Twilio API και αποκτήστε έναν αριθμό τηλεφώνου

Για να χρησιμοποιήσετε το Twilio και να στείλετε αιτήματα OTP στο κινητό σας τηλέφωνο, χρειάζεστε διαπιστευτήρια ελέγχου ταυτότητας μαζί με έναν αριθμό τηλεφώνου Twilio. Για να το πετύχετε:

  1. Εγγραφείτε για έναν λογαριασμό Twilio και επισκεφτείτε το Κονσόλα Twilio.
  2. Κάντε κύλιση προς τα κάτω και κάντε κλικ στο Λήψη αριθμού τηλεφώνου κουμπί. Αντιγράψτε τον αριθμό τηλεφώνου που δημιουργήθηκε.
  3. Κάντε κύλιση προς τα κάτω στο Πληροφορίες λογαριασμού Ενότητα. Αντιγράψτε το SID λογαριασμού και το Διακριτικό Auth.

Δόμηση της Δομής της Εφαρμογής

Μπορείτε να βρείτε ολόκληρο τον πηγαίο κώδικα για τη δημιουργία ενός συστήματος επαλήθευσης OTP χρησιμοποιώντας Python σε αυτό Αποθετήριο GitHub.

Εισαγάγετε τις απαραίτητες μονάδες και ορίστε τα διαπιστευτήρια ελέγχου ταυτότητας. Αρχικοποιήστε το πρόγραμμα-πελάτη Twilio για έλεγχο ταυτότητας και να είναι το σημείο εισόδου για κλήσεις API. Ρυθμίστε το χρόνο λήξης σε δύο λεπτά.

Ορίστε μια τάξη, Επαλήθευση OTP, και αρχικοποιήστε τον κατασκευαστή για να ορίσετε τις προεπιλεγμένες τιμές των μεταβλητών μαζί με την προετοιμασία του ριζικού παραθύρου και τον ορισμό του τίτλου και των διαστάσεων της εφαρμογής.

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

Ορίστε τρεις ετικέτες για να ζητήσετε έναν αριθμό κινητού τηλεφώνου και ένα OTP και για να εμφανίσετε ένα χρονόμετρο αφού το πρόγραμμα στείλει ένα OTP. Ορίστε το γονικό στοιχείο, το κείμενο που πρέπει να εμφανίζεται και τα στυλ γραμματοσειράς που πρέπει να διαθέτει. Ομοίως, δημιουργήστε δύο γραφικά στοιχεία εισόδου για να λαμβάνετε στοιχεία από τον χρήστη. Ορίστε το γονικό του στοιχείο, το πλάτος του και τα στυλ γραμματοσειράς του.

Δημιουργήστε τρία κουμπιά για να στείλετε OTP, να στείλετε ξανά OTP και να επαληθεύσετε το OTP. Ορίστε το γονικό του στοιχείο, το κείμενο που πρέπει να εμφανίζεται, την εντολή που πρέπει να εκτελείται όταν γίνεται κλικ και τα στυλ γραμματοσειράς του. Οργανώστε αυτά τα στοιχεία χρησιμοποιώντας το πακέτο μέθοδος.

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

Δόμηση της Λειτουργικότητας της Εφαρμογής

Ορίστε μια μέθοδο, start_timer() που τρέχει timer_countdown σε ξεχωριστό νήμα.

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

Ορίστε μια μέθοδο, timer_countdown(). Καταγράψτε την ώρα έναρξης και εκτελέστε έναν άπειρο βρόχο που παίρνει την τρέχουσα ώρα και υπολογίζει τον χρόνο που πέρασε και τον υπολειπόμενο χρόνο. Αν stop_timer είναι αλήθεια, τερματίστε τον βρόχο. Εάν ο χρόνος που απομένει είναι μικρότερος ή ίσος με μηδέν, εμφανίστε ένα πλαίσιο μηνύματος σφάλματος που λέει ότι το OTP έληξε.

Ενεργοποιήστε το κουμπί επανάληψης αποστολής OTP, ορίστε το OTP σε κανένα και τερματίστε. Διαφορετικά, υπολογίστε τα λεπτά και τα δευτερόλεπτα που απομένουν, εμφανίστε τα στην ετικέτα του χρονοδιακόπτη και κοιμηθείτε για ένα δευτερόλεπτο.

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)

Ορίστε μια μέθοδο, send_otp(). Αν κλειδωμένο είναι αληθές, εμφανίστε το κατάλληλο μήνυμα. Διαφορετικά, εξαγάγετε τον αριθμό τηλεφώνου, επικυρώστε τον και δημιουργήστε ένα τυχαίο OTP. Περάστε το κινητό τηλέφωνο που πήρατε νωρίτερα και χρησιμοποιήστε τον πελάτη για να στείλετε το OTP στον αριθμό τηλεφώνου σας. Εμφανίστε ένα πλαίσιο μηνύματος, ξεκινήστε το χρονόμετρο, απενεργοποιήστε τα κουμπιά και διαγράψτε εντελώς την καταχώριση.

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)

Ορίστε μια μέθοδο, resend_otp(). Εάν είναι κλειδωμένο, εμφανίστε το κατάλληλο μήνυμα. Διαφορετικά, λάβετε τον αριθμό τηλεφώνου, επικυρώστε τον, δημιουργήστε εκ νέου ένα τυχαίο OTP, στείλτε ξανά το OTP, εμφανίστε το πλαίσιο μηνύματος, ξεκινήστε το χρονόμετρο και απενεργοποιήστε το κουμπί εκ νέου αποστολής OTP.

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)

Ορίστε μια μέθοδο, verify_otp(). Αποκτήστε το OTP και ελέγξτε αν ο χρήστης δεν έχει εισάγει τίποτα. Εάν το αποθηκευμένο OTP είναι Κανένας, ζητήστε από τον χρήστη να δημιουργήσει πρώτα το OTP. Εάν το OTP που εισήγαγε ο χρήστης ταιριάζει με το αποθηκευμένο, εμφανίστε το μήνυμα επιτυχούς επαλήθευσης OTP, σταματήστε το χρονόμετρο και βγείτε από το πρόγραμμα. Διαφορετικά, ελέγξτε για λάθος προσπάθειες. Εάν οι λανθασμένες προσπάθειες υπερβαίνουν τις τρεις, κλειδώστε τον λογαριασμό.

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

Ορίστε μια μέθοδο, lock_account(). Ορίστε την κατάσταση κλειδώματος σε true και εμφανίστε την ετικέτα ως Κλειδωμένος λογαριασμός. Απενεργοποιήστε όλες τις ετικέτες, τις καταχωρήσεις και τα κουμπιά. Σταματήστε το υπάρχον χρονόμετρο και ξεκινήστε ένα νέο για δέκα λεπτά.

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)

Ορίστε μια μέθοδο start_countdown(). Εάν ο χρόνος που απομένει είναι μικρότερος ή ίσος με μηδέν, επαναφέρετε τον λογαριασμό. Διαφορετικά, εμφανίστε ότι το πρόγραμμα έχει κλειδώσει τον λογαριασμό και δοκιμάστε ξανά στον υπόλοιπο χρόνο χρησιμοποιώντας μια επανάκληση.

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)

Ορίστε μια συνάρτηση, reset_account(). Επαναφέρετε την κατάσταση όλων των γραφικών στοιχείων και των μεταβλητών όπως πριν.

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

Δημιουργήστε το ριζικό παράθυρο, μια παρουσία της κλάσης και εκτελέστε την εφαρμογή Tkinter.

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

Παράδειγμα εξόδου επαλήθευσης με χρήση OTP

Κατά την εκτέλεση του προγράμματος επαλήθευσης OTP, εμφανίζεται ένα παράθυρο που σας ζητά να εισαγάγετε τον αριθμό του κινητού σας τηλεφώνου. Εισαγάγετε το μαζί με τον κωδικό της χώρας σας και πατήστε το Αποστολή OTP κουμπί. Λαμβάνετε ένα μήνυμα ότι το πρόγραμμα έχει στείλει το OTP με επιτυχία και το κουμπί απενεργοποιείται για δύο λεπτά. Ελέγξτε το τηλέφωνό σας για OTP και εισαγάγετε το πριν λήξει.

Όταν εισαγάγετε το σωστό OTP πριν τελειώσει ο χρονοδιακόπτης, λαμβάνετε ένα μήνυμα ότι το πρόγραμμα έχει επαληθεύσει το OTP με επιτυχία και το πρόγραμμα τερματίζεται. Σε περίπτωση που δεν το εισαγάγατε εγκαίρως, θα λάβετε ένα πλαίσιο μηνύματος που θα λέει ότι το OTP έχει λήξει. Μπορείτε να κάνετε κλικ στο Επανάληψη αποστολής OTP κουμπί για να δημιουργήσετε ένα νέο OTP και να το στείλετε στο τηλέφωνό σας.

Εάν εισάγετε λάθος OTP, το πρόγραμμα εμφανίζει ένα πλαίσιο μηνύματος που λέει Το OTP δεν ταιριάζει.

Εάν εισαγάγετε λάθος OTP τρεις φορές, όλα τα πεδία απενεργοποιούνται και ο λογαριασμός κλειδώνεται για δέκα λεπτά.

Χρήση του Twilio με την Python

Χρησιμοποιώντας το Twilio, μπορείτε να δημιουργήσετε ένα σύστημα ειδοποιήσεων SMS για διάφορες εκδηλώσεις. Μπορείτε να το χρησιμοποιήσετε με συσκευές IoT για να ενεργοποιήσετε SMS όταν κάτι πέσει πάνω ή κάτω από ένα συγκεκριμένο όριο ή όταν εντοπίσετε έναν εισβολέα. Μπορείτε να δημιουργήσετε ασφαλή συστήματα σύνδεσης με έλεγχο ταυτότητας δύο παραγόντων, να δημιουργήσετε ένα chatbot WhatsApp και ένα σύστημα υπενθύμισης ραντεβού.

Εκτός από αυτό, μπορείτε να το χρησιμοποιήσετε για επαλήθευση αριθμού τηλεφώνου, καμπάνιες μάρκετινγκ, αποστολή ερευνών και συλλογή σχολίων. Κατά τη δημιουργία οποιασδήποτε εφαρμογής, να έχετε πάντα υπόψη την τιμολόγηση του Twilio API για να αποφύγετε απροσδόκητα κόστη.