Lewati ke konten

ADR-006: Implementasi Otentikasi Dua Faktor

Diusulkan

XOOPS memerlukan peningkatan keamanan untuk otentikasi pengguna. Otentikasi dua faktor (2FA) memberikan lapisan keamanan tambahan selain kata sandi, melindungi akun bahkan jika kata sandi dibobol.

Pertimbangan utama:

  • Kompatibilitas mundur dengan otentikasi yang ada
  • Dukungan untuk beberapa metode 2FA
  • Pengalaman pengguna selama pengaturan dan login
  • Mekanisme pemulihan untuk perangkat yang hilang
  • Integrasi dengan sistem izin yang ada

Kami akan menerapkan TOTP (Kata Sandi Satu Kali Berbasis Waktu) sebagai metode 2FA utama dengan dukungan untuk kode cadangan.

sequenceDiagram
participant U as User
participant X as XOOPS
participant T as TOTP Library
participant D as Database
U->>X: Login with password
X->>D: Validate password
D-->>X: Password valid
X->>D: Check 2FA enabled
D-->>X: 2FA required
X->>U: Request 2FA code
U->>X: Submit TOTP code
X->>T: Validate code
T-->>X: Code valid
X->>U: Login successful
CREATE TABLE `{PREFIX}_users_2fa` (
`user_id` INT(11) NOT NULL,
`secret` VARCHAR(32) NOT NULL,
`enabled` TINYINT(1) DEFAULT 0,
`backup_codes` TEXT,
`last_used` INT(11),
`created` INT(11) NOT NULL,
PRIMARY KEY (`user_id`),
FOREIGN KEY (`user_id`) REFERENCES `{PREFIX}_users`(`uid`)
);
interface TwoFactorAuthInterface
{
public function enable(int $userId): TwoFactorSetup;
public function disable(int $userId): void;
public function verify(int $userId, string $code): bool;
public function generateBackupCodes(int $userId): array;
public function isEnabled(int $userId): bool;
}
class TwoFactorMiddleware implements MiddlewareInterface
{
public function process(
ServerRequestInterface $request,
RequestHandlerInterface $handler
): ResponseInterface {
$session = $request->getAttribute('session');
if ($session->has('pending_2fa_user_id')) {
// User needs to complete 2FA
if ($this->isVerificationRequest($request)) {
return $handler->handle($request);
}
return new RedirectResponse('/2fa/verify');
}
return $handler->handle($request);
}
}
  • Keamanan akun meningkat secara signifikan
  • Kompatibilitas TOTP standar industri (Google Authenticator, Authy, dll.)
  • Kode cadangan mencegah penguncian akun
  • Opsional per pengguna - tidak memaksa adopsi
  • Middleware PSR-15 memungkinkan integrasi yang bersih
  • Langkah login tambahan memengaruhi pengalaman pengguna
  • Pengguna harus mengelola aplikasi pengautentikasi
  • Perangkat yang hilang memerlukan proses pemulihan
  • Penyimpanan dan kueri database tambahan
  • Membutuhkan ketergantungan perpustakaan kriptografi
  1. Tambahkan tabel database untuk data 2FA
  2. Mengimplementasikan layanan TOTP dengan ketergantungan perpustakaan
  3. Tambahkan middleware ke rantai otentikasi
  4. Buat UI pengaturan dan verifikasi
  5. Opsi Admin untuk mewajibkan 2FA untuk grup tertentu

Ditolak karena:

  • Kerentanan pertukaran SIM
  • Biaya SMS gateway
  • Kompleksitas verifikasi nomor telepon
  • Masalah privasi

Ditunda untuk ADR mendatang:

  • Implementasi yang lebih kompleks
  • Dukungan browser terbatas secara historis
  • Biaya pengguna lebih tinggi
  • Bisa ditambahkan bersama TOTP nanti

Ditolak karena:

  • Kompromi akun email menggagalkan tujuan
  • Keterlambatan pengiriman berdampak pada UX
  • Masalah filter spam