Cara Membuat Sistem Login OTP via Email dengan PHP (Tanpa Password!)
Login pakai OTP (One-Time Password) makin populer karena simpel dan cukup aman, apalagi buat aplikasi kecil atau website internal. Di artikel ini, kita akan bikin sistem login OTP sederhana pakai PHP dan MySQL. OTP nanti dikirim lewat email, dan pengguna tinggal masukin kodenya buat login. Gak perlu pakai password sama sekali.
Fitur yang Akan Dibuat
- Form input email
- Generate OTP 6 digit
- Kirim OTP via email
- Verifikasi OTP
- Redirect ke dashboard setelah berhasil login
Persiapan
Siapkan:
- PHP + MySQL
- PHPMailer (buat kirim email)
- Editor dan browser buat ngetes
1. Struktur Folder
/otp-login/ ├── index.php ├── verify.php ├── process_send.php ├── process_verify.php ├── dashboard.php ├── db.php ├── PHPMailer/
2. Buat Database dan Tabel
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(100), otp VARCHAR(6), otp_expires DATETIME );
3. Koneksi ke Database (db.php)
<?php
$conn = new mysqli("localhost", "root", "", "otp_login");
if ($conn->connect_error) die("Koneksi gagal: " . $conn->connect_error);
?>
4. Form Input Email (index.php)
<form method="POST" action="process_send.php"> <input type="email" name="email" placeholder="Masukkan email" required> <button type="submit">Kirim OTP</button> </form>
5. Kirim OTP dan Simpan (process_send.php)
<?php
require 'db.php';
require 'PHPMailer/PHPMailerAutoload.php';
$email = $_POST['email'];
$otp = rand(100000, 999999);
$expire = date("Y-m-d H:i:s", strtotime("+5 minutes"));
// Simpan ke database
$stmt = $conn->prepare("INSERT INTO users (email, otp, otp_expires) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $email, $otp, $expire);
$stmt->execute();
// Kirim email
$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'youremail@gmail.com';
$mail->Password = 'yourpassword';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('youremail@gmail.com', 'OTP Login');
$mail->addAddress($email);
$mail->Subject = 'Kode OTP Kamu';
$mail->Body = "Kode OTP kamu adalah: $otp (berlaku 5 menit)";
if(!$mail->send()) {
echo 'Gagal kirim: ' . $mail->ErrorInfo;
} else {
header("Location: verify.php?email=" . urlencode($email));
}
?>
6. Form Verifikasi OTP (verify.php)
<form method="POST" action="process_verify.php"> <input type="hidden" name="email" value="<?= $_GET['email'] ?>"> <input type="text" name="otp" placeholder="Masukkan kode OTP" required> <button type="submit">Verifikasi</button> </form>
7. Cek OTP (process_verify.php)
<?php
require 'db.php';
$email = $_POST['email'];
$otp = $_POST['otp'];
$stmt = $conn->prepare("SELECT * FROM users WHERE email=? AND otp=? AND otp_expires > NOW()");
$stmt->bind_param("ss", $email, $otp);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
session_start();
$_SESSION['email'] = $email;
header("Location: dashboard.php");
} else {
echo "Kode OTP salah atau sudah kedaluwarsa.";
}
?>
8. Dashboard (dashboard.php)
<?php
session_start();
if (!isset($_SESSION['email'])) {
header("Location: index.php");
exit;
}
echo "Selamat datang, " . $_SESSION['email'];
?>
Penutup
Sistem login OTP ini cocok buat aplikasi kecil atau admin panel yang nggak butuh sistem password ribet. Kalau mau lebih aman, bisa tambahkan fitur seperti:
- Resend OTP dengan batas waktu
- Rate limit percobaan OTP
- Hapus otomatis OTP lama
Semoga bermanfaat. Kalau kamu butuh versi source code-nya atau mau fitur tambahan, tinggal tulis di kolom komentar ya!
