Aktifkan dan jalankan sistem verifikasi OTP di aplikasi Python Anda dengan bantuan panduan ini.

Bahkan jika kata sandi Anda dicuri, sistem verifikasi OTP berfungsi sebagai faktor penting untuk keamanan. Ini menghilangkan kebutuhan untuk mengingat kata sandi, berfungsi sebagai lapisan keamanan ekstra, dan mengurangi risiko phishing.

Belajar membangun sistem verifikasi OTP menggunakan Python yang mengirimkan OTP ke nomor ponsel Anda hanya berlaku selama dua menit dan akun Anda terkunci jika Anda memasukkan OTP yang salah sebanyak tiga kali dalam satu baris.

Instal Modul Tkinter, Twilio, dan Acak

Tkinter memungkinkan Anda untuk membuat aplikasi desktop. Ini menawarkan berbagai widget seperti tombol, label, dan kotak teks yang memudahkan pengembangan aplikasi.

Modul Twilio membantu Anda mengintegrasikan fungsi komunikasi seperti SMS, MMS, panggilan telepon, dan verifikasi langsung ke aplikasi Anda. Ini memiliki infrastruktur berbasis cloud bersama dengan fitur luar biasa seperti penyediaan nomor, templat pesan, dan perekaman panggilan.

instagram viewer

Untuk menginstal modul Twilio dan Tkinter, jalankan perintah berikut di terminal:

pip install twilio tk

Modul Random adalah modul Python bawaan yang digunakan untuk menghasilkan angka pseudo-random. Dengan ini, Anda dapat menghasilkan angka acak, memilih elemen acak dari daftar, mengocok isi daftar, dan banyak lagi. Anda dapat menggunakannya untuk membuat simulasi die roll, pengocok daftar, atau a pembuat kata sandi acak.

Hasilkan Twilio API dan Dapatkan Nomor Telepon

Untuk menggunakan Twilio dan mengirim permintaan OTP ke ponsel Anda, Anda memerlukan kredensial autentikasi beserta nomor telepon Twilio. Untuk mencapai ini:

  1. Mendaftar untuk akun Twilio dan kunjungi Konsol Twilio.
  2. Gulir ke bawah dan klik pada Dapatkan nomor telepon tombol. Salin nomor telepon yang dihasilkan.
  3. Gulir ke bawah ke Info akun bagian. Salin SID akun dan Token Autentikasi.

Membangun Struktur Aplikasi

Anda dapat menemukan seluruh kode sumber untuk membangun Sistem Verifikasi OTP menggunakan Python di sini repositori GitHub.

Impor modul yang diperlukan dan atur kredensial autentikasi. Inisialisasi klien Twilio untuk mengautentikasi dan menjadi titik masuk untuk panggilan API. Tetapkan waktu kedaluwarsa menjadi dua menit.

Tentukan kelas, Verifikasi OTP, dan menginisialisasi konstruktor untuk menyetel nilai default variabel bersama dengan menginisialisasi jendela root, dan menyetel judul, dan dimensi aplikasi.

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

Tetapkan tiga label untuk meminta nomor ponsel, dan OTP, dan untuk menampilkan timer setelah program mengirimkan OTP. Setel elemen induk, teks yang harus ditampilkan, dan gaya font yang harus dimiliki. Demikian pula, buat dua widget entri untuk mendapatkan masukan dari pengguna. Atur elemen induknya, lebarnya, dan gaya fontnya.

Buat tiga tombol untuk mengirim OTP, kirim ulang OTP, dan Verifikasi OTP. Tetapkan elemen induknya, teks yang harus ditampilkan, perintah yang harus dijalankan saat diklik, dan gaya fontnya. Atur elemen-elemen ini menggunakan mengemas metode.

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

Membangun Fungsi Aplikasi

Tentukan metode, start_timer() yang berjalan timer_hitung mundur dalam utas terpisah.

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

Tentukan metode, timer_hitung mundur(). Catat waktu mulai dan jalankan loop tak terbatas yang mengambil waktu saat ini dan menghitung waktu yang telah berlalu dan waktu yang tersisa. Jika stop_timer benar, akhiri loop. Jika waktu yang tersisa kurang dari atau sama dengan nol, tampilkan kotak pesan error yang menyatakan bahwa OTP telah kedaluwarsa.

Aktifkan tombol kirim ulang OTP, setel OTP ke none, dan akhiri. Jika tidak, hitung sisa menit dan detik, tampilkan pada label pengatur waktu, dan tidur selama satu detik.

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)

Tentukan metode, send_otp(). Jika terkunci benar, tampilkan pesan yang sesuai. Jika tidak, ekstrak nomor telepon, validasi, dan hasilkan OTP acak. Lewati ponsel yang Anda dapatkan sebelumnya dan gunakan klien untuk mengirim OTP ke nomor telepon Anda. Tampilkan kotak pesan, mulai pengatur waktu, nonaktifkan tombol, dan hapus entri sepenuhnya.

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)

Tentukan metode, kirim ulang_otp(). Jika terkunci, tampilkan pesan yang sesuai. Jika tidak, dapatkan nomor telepon, validasi, buat ulang OTP acak, kirim ulang OTP, tampilkan kotak pesan, mulai pengatur waktu, dan nonaktifkan tombol kirim ulang 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)

Tentukan metode, verifikasi_otp(). Dapatkan OTP, dan periksa apakah pengguna belum memasukkan apapun. Jika OTP yang disimpan adalah Tidak ada, minta pengguna untuk membuat OTP terlebih dahulu. Jika OTP yang dimasukkan pengguna cocok dengan yang disimpan, tampilkan pesan verifikasi OTP yang berhasil, hentikan pengatur waktu, dan keluar dari program. Jika tidak, periksa upaya yang salah. Jika upaya yang salah melebihi tiga, kunci akun.

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

Tentukan metode, lock_account(). Setel status terkunci ke true dan tampilkan label sebagai Akun terkunci. Nonaktifkan semua label, entri, dan tombol. Hentikan pengatur waktu yang ada dan mulai yang baru selama sepuluh menit.

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)

Tentukan metode mulai_hitung mundur(). Jika sisa waktu kurang dari atau sama dengan nol, setel ulang akun. Jika tidak, tampilkan bahwa program telah mengunci akun dan coba lagi di sisa waktu menggunakan panggilan balik.

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)

Tentukan fungsi, setel ulang_akun(). Setel ulang status semua widget dan variabel seperti sebelumnya.

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

Buat jendela root, instance kelas, dan jalankan aplikasi Tkinter.

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

Contoh Keluaran Verifikasi Menggunakan OTP

Saat menjalankan program Verifikasi OTP, Anda mendapatkan jendela yang meminta Anda untuk memasukkan nomor ponsel Anda. Masukkan bersama dengan kode negara Anda dan tekan Kirim OTP tombol. Anda mendapat pesan bahwa program telah berhasil mengirimkan OTP dan tombol dinonaktifkan selama dua menit. Periksa telepon Anda untuk OTP dan masukkan sebelum kedaluwarsa.

Saat memasukkan OTP yang benar sebelum penghitung waktu habis, Anda mendapat pesan bahwa program telah berhasil memverifikasi OTP, dan program keluar. Jika Anda tidak memasukkannya tepat waktu, Anda akan mendapatkan kotak pesan yang mengatakan bahwa OTP telah kedaluwarsa. Anda dapat mengklik pada Kirim ulang OTP tombol untuk menghasilkan OTP baru dan mengirimkannya ke ponsel Anda.

Jika Anda memasukkan OTP yang salah, program akan menampilkan kotak pesan bertuliskan OTP tidak cocok.

Jika Anda memasukkan OTP yang salah sebanyak tiga kali, semua kolom akan dinonaktifkan dan akun akan terkunci selama sepuluh menit.

Menggunakan Twilio Dengan Python

Menggunakan Twilio, Anda dapat membangun sistem notifikasi SMS untuk berbagai acara. Anda dapat menggunakannya dengan perangkat IoT untuk memicu SMS saat ada sesuatu yang berada di atas atau di bawah ambang batas tertentu atau saat Anda mendeteksi penyusup. Anda dapat membangun sistem login yang aman dengan autentikasi dua faktor, membangun chatbot WhatsApp, dan sistem pengingat janji temu.

Selain itu, Anda dapat menggunakannya untuk verifikasi nomor telepon, kampanye pemasaran, mengirim survei, dan mengumpulkan umpan balik. Saat membuat aplikasi apa pun, selalu perhatikan harga Twilio API untuk menghindari biaya tak terduga.