Obtenez le système de vérification OTP opérationnel dans votre application Python à l'aide de ce guide.
Même si votre mot de passe est volé, les systèmes de vérification OTP constituent un facteur crucial de sécurité. Il élimine le besoin de mémoriser les mots de passe, sert de couche de sécurité supplémentaire et réduit les risques de phishing.
Apprendre à construire un système de vérification OTP en utilisant Python qui vous envoie un OTP à votre numéro de mobile, c'est n'est valable que deux minutes et votre compte est verrouillé si vous entrez trois fois le mauvais OTP dans un rangée.
Installer les modules Tkinter, Twilio et Random
Tkinter vous permet de créer des applications de bureau. Il offre une variété de widgets tels que des boutons, des étiquettes et des zones de texte qui facilitent le développement d'applications.
Le module Twilio vous aide à intégrer des fonctionnalités de communication comme les SMS, MMS, appels téléphoniques et vérification directement dans votre application. Il dispose d'une infrastructure basée sur le cloud ainsi que de fonctionnalités étonnantes telles que la fourniture de numéros, les modèles de message et l'enregistrement des appels.
Pour installer les modules Twilio et Tkinter, exécutez la commande suivante dans le terminal :
pip install twilio tk
Le module Random est un module Python intégré utilisé pour générer des nombres pseudo-aléatoires. Avec cela, vous pouvez générer des nombres aléatoires, choisir des éléments aléatoires dans une liste, mélanger le contenu d'une liste, etc. Vous pouvez l'utiliser pour créer une simulation de lancer de dé, un mélangeur de liste ou un générateur de mot de passe aléatoire.
Générer l'API Twilio et obtenir un numéro de téléphone
Pour utiliser Twilio et envoyer des requêtes OTP à votre téléphone mobile, vous avez besoin d'informations d'authentification ainsi que d'un numéro de téléphone Twilio. Pour y parvenir :
- Ouvrez un compte Twilio et visitez le Console Twillio.
- Faites défiler vers le bas et cliquez sur le Obtenir le numéro de téléphone bouton. Copiez le numéro de téléphone généré.
- Faites défiler jusqu'à Informations de compte section. Copiez le ID du compte et le Jeton d'authentification.
Construire la structure de l'application
Vous pouvez trouver le code source complet pour créer un système de vérification OTP à l'aide de Python dans ce Référentiel GitHub.
Importez les modules nécessaires et définissez les identifiants d'authentification. Initialisez le client Twilio pour s'authentifier et être le point d'entrée pour les appels d'API. Réglez le délai d'expiration sur deux minutes.
Définir une classe, Vérification OTP, et initialiser le constructeur pour définir les valeurs par défaut des variables tout en initialisant la fenêtre racine et en définissant le titre et les dimensions de l'application.
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
Définissez trois étiquettes pour demander un numéro de mobile et un OTP, et pour afficher une minuterie après que le programme a envoyé un OTP. Définissez l'élément parent, le texte qu'il doit afficher et les styles de police qu'il doit posséder. De même, créez deux widgets d'entrée pour obtenir l'entrée de l'utilisateur. Définissez son élément parent, sa largeur et ses styles de police.
Créez trois boutons pour envoyer OTP, renvoyer OTP et vérifier OTP. Définissez son élément parent, le texte qu'il doit afficher, la commande qu'il doit exécuter lorsqu'il est cliqué et ses styles de police. Organisez ces éléments à l'aide des paquet méthode.
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()
Construire la fonctionnalité de l'application
Définir une méthode, start_timer() qui court timer_countdown dans un fil séparé.
defstart_timer(self):
self.timer_thread = threading.Thread(target=self.timer_countdown)
self.timer_thread.start()
Définir une méthode, timer_countdown(). Enregistrez l'heure de début et exécutez une boucle infinie qui prend l'heure actuelle et calcule le temps écoulé et le temps restant. Si stop_timer est vrai, terminez la boucle. Si le temps restant est inférieur ou égal à zéro, affichez une boîte de message d'erreur indiquant que l'OTP a expiré.
Activez le bouton Renvoyer OTP, réglez l'OTP sur aucun et terminez. Sinon, calculez les minutes et les secondes restantes, affichez-les sur l'étiquette de la minuterie et dormez pendant une seconde.
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)
Définir une méthode, send_otp(). Si fermé à clé est vrai, affichez le message approprié. Sinon, extrayez le numéro de téléphone, validez-le et générez un OTP aléatoire. Passez le téléphone portable que vous avez obtenu plus tôt et utilisez le client pour envoyer l'OTP à votre numéro de téléphone. Affichez une boîte de message, démarrez la minuterie, désactivez les boutons et effacez complètement l'entrée.
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)
Définir une méthode, renvoyer_otp(). S'il est verrouillé, affichez le message approprié. Sinon, obtenez le numéro de téléphone, validez-le, régénérez un OTP aléatoire, renvoyez l'OTP, affichez la boîte de message, démarrez la minuterie et désactivez le bouton Renvoyer 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)
Définir une méthode, vérifier_otp(). Obtenez l'OTP et vérifiez si l'utilisateur n'a rien saisi. Si l'OTP stocké est Aucun, demandez à l'utilisateur de générer d'abord l'OTP. Si l'OTP saisi par l'utilisateur correspond à celui enregistré, affichez le message de vérification OTP réussi, arrêtez le chronomètre et quittez le programme. Sinon, vérifiez les mauvaises tentatives. Si le nombre de tentatives erronées dépasse trois, verrouillez le compte.
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.')
Définir une méthode, verrouiller_compte(). Définissez l'état verrouillé sur vrai et affichez l'étiquette comme Compte bloqué. Désactivez toutes les étiquettes, entrées et boutons. Arrêtez la minuterie existante et démarrez-en une nouvelle pendant dix minutes.
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)
Définir une méthode start_countdown(). Si le temps restant est inférieur ou égal à zéro, réinitialisez le compte. Sinon, affichez que le programme a verrouillé le compte et réessayez dans le temps restant en utilisant un rappel.
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)
Définir une fonction, reset_account(). Réinitialisez le statut de tous les widgets et variables comme avant.
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
Créez la fenêtre racine, une instance de la classe, et exécutez l'application Tkinter.
if __name__ == '__main__':
root = tk.Tk()
otp_verification = OTPVerification(root)
root.mainloop()
Exemple de sortie de vérification à l'aide d'OTP
Lors de l'exécution du programme de vérification OTP, vous obtenez une fenêtre vous demandant d'entrer votre numéro de téléphone portable. Entrez-le avec votre code de pays et appuyez sur le Envoyer OTP bouton. Vous recevez un message indiquant que le programme a envoyé l'OTP avec succès et le bouton se désactive pendant deux minutes. Vérifiez votre téléphone pour OTP et entrez-le avant qu'il n'expire.
En entrant le bon OTP avant la fin du temps imparti, vous obtenez un message indiquant que le programme a vérifié l'OTP avec succès et le programme se termine. Si vous ne l'avez pas saisi à temps, vous recevrez une boîte de message indiquant que l'OTP a expiré. Vous pouvez cliquez sur le Renvoyer OTP pour générer un nouvel OTP et l'envoyer à votre téléphone.
Si vous entrez le mauvais OTP, le programme affiche une boîte de message disant OTP ne correspond pas.
Si vous entrez trois fois le mauvais OTP, tous les champs sont désactivés et le compte est verrouillé pendant dix minutes.
Utiliser Twilio avec Python
En utilisant Twilio, vous pouvez créer un système de notification par SMS pour divers événements. Vous pouvez l'utiliser avec des appareils IoT pour déclencher des SMS lorsque quelque chose tombe au-dessus ou en dessous d'un certain seuil ou lorsque vous détectez un intrus. Vous pouvez créer des systèmes de connexion sécurisés avec une authentification à deux facteurs, créer un chatbot WhatsApp et un système de rappel de rendez-vous.
En dehors de cela, vous pouvez l'utiliser pour la vérification des numéros de téléphone, les campagnes marketing, l'envoi d'enquêtes et la collecte de commentaires. Lors de la création d'une application, gardez toujours à l'esprit la tarification de l'API Twilio pour éviter des coûts inattendus.