Skip to content

OTP

Direktori: app/Services/Otp/

Layanan One-Time Password untuk generate dan verifikasi kode. Dipakai oleh wizard setup untuk verifikasi email, dan fitur lain yang butuh verifikasi kode berbasis email.

Ringkasan

Dua operasi:

  1. Generate — buat kode 6-digit, simpan di tabel otps dengan expiry 10 menit
  2. Verify — cek kode yang dimasukkan, handle expired/invalid

Kenapa Ada

  • Keamanan: Kode pakai random_int() (cryptographically secure), bukan rand()
  • Self-cleaning: Kode lama dihapus sebelum generate baru; kode expired/terverifikasi dihapus saat dicek
  • Traceable: Setiap OTP menyimpan metadata (email, IP, user agent)
  • Time-limited: Kode expired 10 menit

Method

Generate::handle(string $email, array $meta = []): Otp

Algoritma:

  1. Hapus semua OTP existing untuk email ini
  2. Generate kode 6-digit: str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT)
  3. Simpan di otps dengan expired_at = now() + 10 minutes
  4. Return instance Otp
php
$otp = Generate::handle('user@example.com');
// Kirim $otp->code ke email user

Verify::handle(string $email, string $code): array

Algoritma:

  1. Query otps WHERE code = input AND meta->email = email
  2. Tidak ditemukan → { success: false, message: '...' }
  3. Expired → hapus, return { success: false, message: 'Expired.' }
  4. Valid → hapus OTP (one-time use), return { success: true }
php
$result = Verify::handle('user@example.com', '123456');
if ($result['success']) { /* verified */ }

Frontend Integration

otp-form.stores.ts → otp.services.ts → otp.api.ts → POST /api/setup/send-otp
StoreTujuan
super-user-otp-form.stores.tsInput kode + state send/verify
super-user-otp-modal.stores.tsModal OTP open/close
super-user-otp-resend.stores.tsCountdown resend (60s)

File Penting

FileTujuan
app/Services/Otp/Generate.phpGenerate kode + simpan ke database
app/Services/Otp/Verify.phpVerifikasi kode + cek expired
app/Models/Platform/Otp/Otp.phpModel otps — code, expired_at, meta
app/Http/Controllers/Api/OtpController.phpAPI controller (send + verify)