Daftar & Masuk Cepat Tanpa Pindah Halaman
Masuk atau daftar akun cukup lewat jendela sembulan kecil di layar tanpa memuat ulang halaman, dibantu kode verifikasi singkat ke email.
Masuk atau daftar akun cukup lewat jendela sembulan kecil di layar tanpa memuat ulang halaman, dibantu kode verifikasi singkat ke email.
Tantangan & Kebutuhan Pengguna
Pengguna publik umumnya baru diminta login ketika hendak mengeksekusi pembuatan itinerary AI. Mengarahkan mereka ke halaman login/register terpisah akan menghapus seluruh pilihan durasi, budget, dan minat yang sudah mereka isi di formulir. Selain itu, pendaftaran akun baru wajib memverifikasi kepemilikan alamat email secara cepat tanpa meninggalkan halaman.
Autentikasi pada fitur interaktif harus hadir menghampiri konteks pengguna saat itu juga, sambil menjamin integritas data akun apabila layanan pengiriman email mengalami kegagalan.
Solusi & Cara Kerja
Seluruh siklus autentikasi publik ditangani secara asinkron oleh `Public\AuthController` yang mengembalikan respons JSON terstruktur ke modal multi-state (`Register` -> `OTP 6-Digit` -> `Success` / `Login`). Saat registrasi, server membuat record user non-aktif (`is_active = false`) dengan kode OTP kriptografis 6 digit (`random_int(0, 999999)`) yang kedaluwarsa dalam 10 menit, lalu mengirimkan `OtpMail`. Jika pengguna mencoba login ketika akunnya belum aktif, endpoint login mengembalikan kode `403` beserta sinyal `step: 'otp'` yang otomatis mengarahkan modal ke tampilan input 6 kotak OTP.
Berikut adalah implementasi pembangkitan OTP, rollback otomatis saat SMTP gagal, dan verifikasi kode di `app/Http/Controllers/Public/AuthController.php`:
Detail & Hal yang Diperhatikan
- Pencegahan akun terkunci akibat kegagalan SMTP: Apabila `Mail::send()` melempar exception setelah `User::create()`, blok `catch` langsung mengeksekusi `$user->delete()` agar alamat email pengguna tidak tertahan oleh validasi `unique:users,email` saat mencoba daftar ulang.
- Isolasi sesi Admin vs User Publik: Di dalam metode `login()`, terdapat guard eksplisit `if ($user->isAdmin())` yang menolak akun administrator login lewat modal publik dan mengarahkannya ke pintu khusus `/admin/login`.
- UX Input OTP 6 kotak otomatis: Antarmuka input 6 digit dilengkapi handler `otpKeyup` dan `otpKeydown` yang memindahkan fokus kursor secara otomatis ke kotak berikutnya saat angka diketik dan mundur saat tombol `Backspace` ditekan.
Endpoint pembuatan itinerary dilindungi oleh `GuestJsonMiddleware` (`auth.check`) dan konfigurasi `redirectGuestsTo(fn() => null)` di `bootstrap/app.php` agar request tanpa sesi menerima respons JSON `401` yang bersih, bukan redirect ke route login standar.