הפעל את מערכת אימות ה-OTP באפליקציית Python שלך בעזרת מדריך זה.
גם אם הסיסמה שלך נגנבת, מערכות אימות OTP משמשות גורם מכריע לאבטחה. זה מבטל את הצורך לזכור סיסמאות, משמש כשכבת אבטחה נוספת ומפחית את הסיכונים של פישינג.
למד לבנות מערכת אימות OTP באמצעות Python ששולחת לך OTP למספר הנייד שלך תקף רק לשתי דקות והחשבון שלך ננעל אם תזין את ה-OTP הלא נכון שלוש פעמים ב-a שׁוּרָה.
התקן מודולים של Tkinter, Twilio ו-Random
Tkinter מאפשר לך ליצור יישומי שולחן עבודה. הוא מציע מגוון של ווידג'טים כמו לחצנים, תוויות ותיבות טקסט שמקלים על פיתוח יישומים.
מודול Twilio עוזר לך לשלב פונקציונליות תקשורת כמו SMS, MMS, שיחות טלפון ואימות ישירות לתוך האפליקציה שלך. יש לו תשתית מבוססת ענן יחד עם תכונות מדהימות כמו הקצאת מספרים, תבניות הודעות והקלטת שיחות.
כדי להתקין את המודולים Twilio ו-Tkinter, הפעל את הפקודה הבאה בטרמינל:
pip install twilio tk
המודול האקראי הוא מודול Python מובנה המשמש ליצירת מספרים פסאודו אקראיים. בעזרת זה, אתה יכול ליצור מספרים אקראיים, לבחור אלמנטים אקראיים מתוך רשימה, לערבב את התוכן של רשימה ועוד. אתה יכול להשתמש בו כדי לבנות סימולציית קוביות, ערבב רשימה או א מחולל סיסמאות אקראי.
צור את ה-API של Twilio וקבל מספר טלפון
כדי להשתמש ב-Twilio ולשלוח בקשות OTP לטלפון הנייד שלך, אתה זקוק לאישורי אימות יחד עם מספר טלפון של Twilio. כדי להשיג זאת:
- הירשם לחשבון Twilio ובקר באתר קונסולת Twilio.
- גלול מטה ולחץ על קבל מספר טלפון לַחְצָן. העתק את מספר הטלפון שנוצר.
- גלול מטה אל פרטי חשבון סָעִיף. העתק את SID חשבון וה Auth Token.
בניית מבנה האפליקציה
אתה יכול למצוא את כל קוד המקור לבניית מערכת אימות OTP באמצעות Python כאן מאגר GitHub.
ייבא את המודולים הדרושים והגדר את אישורי האימות. אתחל את לקוח Twilio כדי לאמת ולהיות נקודת הכניסה לקריאות API. הגדר את זמן התפוגה לשתי דקות.
הגדירו מחלקה, אימות OTP, ואתחול הבנאי כדי להגדיר את ערכי ברירת המחדל של משתנים יחד עם אתחול חלון השורש, והגדרת הכותרת והממדים של היישום.
import tkinter as tk
from tkinter import messagebox
from twilio.rest import Client
import random
import threading
import timeaccount_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() שרץ טיימר_ספירה לאחור בשרשור נפרד.
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 כאשר משהו נופל מעל או מתחת לסף מסוים או כאשר אתה מזהה פולש. אתה יכול לבנות מערכות התחברות מאובטחות עם אימות דו-שלבי, לבנות צ'אטבוט של WhatsApp ומערכת תזכורת לפגישה.
מלבד זאת, אתה יכול להשתמש בו לאימות מספר טלפון, קמפיינים שיווקיים, שליחת סקרים ואיסוף משוב. בעת בניית כל אפליקציה, הקפד תמיד לתמחור של Twilio API כדי למנוע עלויות בלתי צפויות.