Dalam sistem login modern, manajemen keamanan akun pengguna adalah fitur wajib. Bukan hanya login dan logout, tetapi juga bagaimana pengguna dapat mengontrol pengaturan keamanannya sendiri seperti melihat status 2FA, mengatur ulang kode recovery, dan memantau aktivitas keamanan akun, karena itu dalam tutorial kali ini akan dibahas tentang manajemen 2FA.
Artikel ini akan membahas cara membangun dashboard keamanan akun di PHP, yang mencakup:
-
Melihat status 2FA (aktif/nonaktif)
-
Menampilkan kode recovery
-
Fitur regenerasi kode baru
-
Menghapus kode lama
-
Menampilkan log aktivitas keamanan (misalnya saat 2FA diaktifkan, dinonaktifkan, atau kode digunakan)
Semuanya akan dibuat dengan pendekatan PHP MySQLi (OOP), tampilan berbasis Bootstrap 5, dan konsep keamanan seperti CSRF token dan password hashing.
Struktur Tabel Database
Kita akan menggunakan tiga tabel utama:
-- Tabel users CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(100) UNIQUE, password VARCHAR(255), two_factor_enabled TINYINT(1) DEFAULT 0, two_factor_secret VARCHAR(255) DEFAULT NULL ); -- Tabel recovery codes CREATE TABLE user_recovery_codes ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, code_hash VARCHAR(255) NOT NULL, used TINYINT(1) DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); -- Tabel log keamanan CREATE TABLE security_logs ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, action VARCHAR(100), description TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE );
Menampilkan Status 2FA di Dashboard
<?php
session_start();
require 'config.php';
$user_id = $_SESSION['user_id'];
$stmt = $mysqli->prepare("SELECT two_factor_enabled FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id);
$stmt->execute();
$stmt->bind_result($twofa_enabled);
$stmt->fetch();
$stmt->close();
?>
<div class="card shadow p-3 mb-4">
<h5 class="card-title">Status Autentikasi Dua Faktor (2FA)</h5>
<?php if ($twofa_enabled): ?>
<p class="text-success fw-bold">✅ 2FA Aktif</p>
<a href="disable_2fa.php" class="btn btn-danger btn-sm">Nonaktifkan 2FA</a>
<?php else: ?>
<p class="text-danger fw-bold">❌ 2FA Tidak Aktif</p>
<a href="enable_2fa.php" class="btn btn-primary btn-sm">Aktifkan 2FA</a>
<?php endif; ?>
</div>
Tampilan ini bisa kamu letakkan di halaman dashboard keamanan pengguna, biasanya di bagian “Keamanan Akun” atau “Pengaturan Login”.
Menampilkan dan Mengelola Kode Recovery
<?php
$stmt = $mysqli->prepare("SELECT id, used, created_at FROM user_recovery_codes WHERE user_id = ?");
$stmt->bind_param("i", $user_id);
$stmt->execute();
$result = $stmt->get_result();
?>
<div class="card shadow p-3 mb-4">
<h5 class="card-title">Kode Recovery</h5>
<p>Gunakan kode ini jika tidak dapat mengakses 2FA utama. Setiap kode hanya bisa digunakan sekali.</p>
<table class="table table-bordered">
<thead>
<tr>
<th>#</th>
<th>Status</th>
<th>Dibuat</th>
</tr>
</thead>
<tbody>
<?php
$i = 1;
while ($row = $result->fetch_assoc()):
?>
<tr>
<td><?= $i++; ?></td>
<td><?= $row['used'] ? '<span class="text-danger">Sudah Digunakan</span>' : '<span class="text-success">Aktif</span>'; ?></td>
<td><?= $row['created_at']; ?></td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
<a href="generate_recovery.php" class="btn btn-warning btn-sm">Regenerasi Kode Baru</a>
<a href="delete_recovery.php" class="btn btn-danger btn-sm">Hapus Semua Kode</a>
</div>
Regenerasi Kode Baru (generate_recovery.php)
<?php
require 'config.php';
session_start();
$user_id = $_SESSION['user_id'];
// Hapus kode lama
$mysqli->query("DELETE FROM user_recovery_codes WHERE user_id = $user_id");
// Buat kode baru
$jumlah = 5;
for ($i = 0; $i < $jumlah; $i++) {
$code = strtoupper(substr(str_shuffle('ABCDEFGHJKLMNPQRSTUVWXYZ23456789'), 0, 8));
$hash = password_hash($code, PASSWORD_DEFAULT);
$stmt = $mysqli->prepare("INSERT INTO user_recovery_codes (user_id, code_hash) VALUES (?, ?)");
$stmt->bind_param("is", $user_id, $hash);
$stmt->execute();
$codes[] = $code;
}
$stmt = $mysqli->prepare("INSERT INTO security_logs (user_id, action, description) VALUES (?, ?, ?)");
$desc = "Regenerasi kode recovery baru.";
$action = "REGENERATE_RECOVERY";
$stmt->bind_param("iss", $user_id, $action, $desc);
$stmt->execute();
echo "<h4>Kode Recovery Baru</h4><ul>";
foreach ($codes as $code) echo "<li>$code</li>";
echo "</ul><p>Simpan kode ini dengan aman!</p>";
?>
Hapus Semua Kode Recovery (delete_recovery.php)
<?php
require 'config.php';
session_start();
$user_id = $_SESSION['user_id'];
$mysqli->query("DELETE FROM user_recovery_codes WHERE user_id = $user_id");
$stmt = $mysqli->prepare("INSERT INTO security_logs (user_id, action, description) VALUES (?, ?, ?)");
$desc = "Menghapus semua kode recovery.";
$action = "DELETE_RECOVERY";
$stmt->bind_param("iss", $user_id, $action, $desc);
$stmt->execute();
header("Location: dashboard_security.php?deleted=1");
exit;
?>
Menampilkan Log Aktivitas Keamanan
<?php
$stmt = $mysqli->prepare("SELECT action, description, created_at FROM security_logs WHERE user_id = ? ORDER BY created_at DESC");
$stmt->bind_param("i", $user_id);
$stmt->execute();
$result = $stmt->get_result();
?>
<div class="card shadow p-3">
<h5 class="card-title">Log Aktivitas Keamanan</h5>
<table class="table table-striped">
<thead><tr><th>Aksi</th><th>Keterangan</th><th>Waktu</th></tr></thead>
<tbody>
<?php while ($log = $result->fetch_assoc()): ?>
<tr>
<td><?= htmlspecialchars($log['action']); ?></td>
<td><?= htmlspecialchars($log['description']); ?></td>
<td><?= $log['created_at']; ?></td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
</div>
Tips Keamanan Tambahan
-
Gunakan CSRF token di semua aksi (regenerasi & hapus).
-
Tambahkan konfirmasi password sebelum regenerasi kode baru.
-
Batasi frekuensi regenerasi kode, misalnya hanya 1x per 24 jam.
-
Kirim notifikasi email otomatis setiap kali 2FA diubah atau kode recovery diperbarui.
-
Gunakan password_hash dan password_verify untuk keamanan maksimal.
Kesimpulan
Dengan menerapkan sistem manajemen 2FA dan kode recovery di dashboard akun PHP, kamu memberikan kontrol keamanan penuh kepada pengguna tanpa mengorbankan kenyamanan. Mereka dapat melihat status 2FA, mengganti kode recovery, serta memantau aktivitas login yang mencurigakan — semuanya terintegrasi rapi di satu halaman.
Konsep ini dapat dikembangkan lebih lanjut dengan notifikasi real-time, monitoring IP login, hingga autentikasi adaptif (adaptive authentication) seperti yang digunakan platform besar.