Cara Membuat Fitur Lupa Password di Laravel: Reset Password via Email yang Aman (Panduan 2026)
Cara Membuat Fitur Lupa Password di Laravel: Reset Password via Email yang Aman (Panduan 2026)
Fitur lupa password di Laravel dibuat dengan Password broker bawaan: pengguna memasukkan email, Laravel mengirim link reset bertoken ke email tersebut, lalu pengguna mengatur password baru lewat halaman reset. Anda tidak perlu Breeze atau Fortify; cukup route, controller, dan dua view Blade, plus konfigurasi email yang benar.
Panduan ini mengikuti dokumentasi resmi Laravel 12, ditambah bagian yang paling sering dilewati tutorial lain: anti user-enumeration, throttle, masa berlaku token, antrean email, pengujian, dan troubleshooting saat email tidak sampai.
Apa itu Password broker di Laravel?
Password broker mengurus seluruh logika reset password: membuat token, menyimpannya dalam bentuk hash di tabel password_reset_tokens, mengirim notifikasi email, lalu memvalidasi token saat pengguna mengirim password baru. Anda tidak perlu menulis logika token sendiri — dan itu justru poin keamanannya, karena token buatan sendiri rawan ditebak, tidak kedaluwarsa, atau tersimpan dalam bentuk teks biasa.
| Tahap Yang terjadi | |
| 1. Minta link | Pengguna mengisi email di halaman lupa password |
| 2. Kirim email | Laravel membuat token, menyimpannya ter-hash, dan mengirim link |
| 3. Buka link | Pengguna klik link dari email, masuk ke halaman reset |
| 4. Password baru | Laravel memvalidasi token, mengganti password, dan menonaktifkan token |
Apa saja prasyaratnya?
- Proyek Laravel 11 atau 12 dengan tabel
usersdan kolomemailyang unik. - Model
Usermemakai traitNotifiabledanCanResetPassword. - Pengiriman email sudah jalan (SMTP atau layanan lain; di lokal bisa memakai Mailtrap atau driver
log). - Halaman login sudah ada, karena setelah reset berhasil pengguna diarahkan kembali ke sana.
Tabel password_reset_tokens sudah tersedia di migrasi bawaan Laravel modern. Bila proyek Anda dari versi lama dan tabelnya belum ada, buat migrasinya lalu jalankan php artisan migrate.
Bagaimana cara mengonfigurasi email dan masa berlaku token?
Atur pengirim email di .env:
Lalu periksa config/auth.php pada bagian passwords. Nilai expire 60 berarti token berlaku 60 menit — sudah masuk akal untuk kebanyakan aplikasi. Nilai throttle 60 berarti pengguna yang sama hanya bisa meminta link baru sekali per 60 detik, perlindungan sederhana terhadap spam permintaan reset.
Bagaimana cara membuat route lupa password?
Tambahkan empat route ini di routes/web.php, semuanya dengan middleware guest karena hanya pengguna yang belum login yang boleh mereset password:
Nama route ini mengikuti konvensi Laravel.
Bagaimana cara mengirim link reset password?
Controller pertama hanya memvalidasi email, lalu meminta broker mengirim link lewat Password::sendResetLink():
Kenapa pesannya harus selalu sama?
Jika aplikasi menjawab "email tidak ditemukan" untuk alamat yang belum terdaftar, penyerang bisa memanen daftar email pengguna Anda satu per satu. Praktik yang lebih aman: selalu tampilkan pesan yang sama, misalnya "Jika email tersebut terdaftar, link reset sudah kami kirimkan." Laravel tetap hanya mengirim email ke alamat yang benar-benar terdaftar, dan error pengiriman tetap tercatat di log aplikasi Anda.
Bagaimana cara membatasi permintaan berulang?
Tambahkan throttle pada route pengiriman link — throttle:5,1 berarti maksimal 5 permintaan per menit per IP:
Bagaimana cara membuat halaman reset password?
Form lupa password hanya butuh satu input email plus tombol kirim. Halaman reset memakai token dari URL sebagai hidden input, ditambah email dan password baru dengan konfirmasi:
Controller resetnya memvalidasi token lewat broker, mengganti password dengan hash baru, memperbarui remember token, dan memicu event PasswordReset:
Memperbarui remember token menonaktifkan semua sesi "ingat saya" lama. Bila ingin lebih ketat, tambahkan Auth::logoutOtherDevices($password) di dalam callback.
Bagaimana cara menyesuaikan email reset dan memakai antrean?
Ubah subjek dan isi email lewat ResetPassword::toMailUsing() di AppServiceProvider, agar email tidak terlihat seperti template generik:
Agar pengiriman tidak memperlambat halaman, kirim lewat antrean dengan menambahkan ShouldQueue pada class notifikasi kustom Anda — pola yang sama dengan pengiriman email otomatis Laravel dengan queue. Jangan lupa menjalankan queue worker di produksi, karena email antrean yang tidak diproses terlihat persis seperti "email tidak terkirim" di mata pengguna.
Bagaimana cara menguji fitur ini?
Tulis satu feature test dengan Notification::fake(): kirim token dari notifikasi ke endpoint reset dan pastikan tidak ada error sesi. Tambahkan tiga kasus negatif: token salah, password tanpa konfirmasi, dan token kedaluwarsa — ketiganya harus gagal.
Kenapa email reset tidak sampai? (Troubleshooting)
| Gejala Penyebab paling umum Perbaiki | ||
| Tidak ada email sama sekali | Queue worker tidak jalan | Jalankan queue:work atau ubah QUEUE_CONNECTION ke sync sementara |
| Email masuk spam | MAIL_FROM_ADDRESS tanpa SPF/DKIM | Kirim dari domain sendiri dan lengkapi SPF, DKIM, dan DMARC |
| Link mengarah ke localhost | APP_URL masih http://localhost | Set APP_URL ke domain produksi lalu php artisan config:clear |
| "Token tidak valid" padahal baru diklik | Pengguna meminta link dua kali; token lama hangus | Sarankan memakai link dari email terbaru |
| "Token kedaluwarsa" | Melewati 60 menit | Perpanjang expire di config/auth.php bila perlu |
| Error 500 saat kirim | Kredensial SMTP salah atau port diblokir | Cek storage/logs/laravel.log dan uji SMTP dari panel hosting |
Di shared hosting, dua penyebab pertama paling sering: antrean tidak diproses dan APP_URL lupa diubah setelah deploy. Sebelum mengumumkan fitur ini, kirim satu permintaan reset sungguhan dari domain produksi dan klik linknya sampai tuntas.
Kapan cara ini tidak cocok?
- Pengguna tak punya akses ke email terdaftar. Sediakan jalur reset oleh admin dari dashboard dengan verifikasi identitas manual — jangan membuat pengecualian yang melewati token.
- Login memakai Google atau SSO saja. Akun dari login Google dengan Socialite tidak punya password lokal; halaman reset harus menjelaskan bahwa mereka cukup login lewat Google.
- Aplikasi mobile murni (API). Link web tidak nyaman di dalam aplikasi. Gunakan endpoint API atau kode OTP — misalnya lewat notifikasi WhatsApp otomatis — dengan masa berlaku yang jauh lebih pendek.
- Akun dengan peran sensitif. Pertimbangkan verifikasi tambahan untuk admin, dan atur peran sejak awal lewat sistem multi role dan permission agar reset password tidak menjadi jalan pintas eskalasi hak akses.
FAQ
Apakah fitur lupa password Laravel gratis dan tanpa paket tambahan?
Ya. Password broker, tabel token, dan notifikasi reset sudah termasuk di framework Laravel. Anda hanya membayar layanan pengiriman email yang dipakai.
Berapa lama link reset password Laravel berlaku?
Secara default 60 menit, diatur lewat expire di config/auth.php. Jangan terlalu panjang: link berumur berhari-hari memberi waktu lebih besar bila email pengguna bocor.
Apakah token reset password disimpan dalam bentuk teks biasa?
Tidak. Laravel menyimpan hash token di tabel password_reset_tokens. Token yang dikirim lewat email hanya bisa dicocokkan dengan hash tersebut, sehingga kebocoran database saja tidak cukup untuk memakai token.
Bisakah satu pengguna meminta banyak link reset sekaligus?
Bisa meminta, tetapi setiap permintaan baru menggantikan token sebelumnya, dan throttle membatasi permintaan berulang dalam 60 detik. Sarankan pengguna memakai link dari email terbaru.
Apakah pengguna yang sedang login bisa memakai halaman lupa password?
Seharusnya tidak. Semua route di panduan ini memakai middleware guest. Pengguna yang sudah login sebaiknya mengganti password lewat halaman profil, dengan verifikasi password lama.
Apakah reset password otomatis mengeluarkan pengguna dari perangkat lain?
Mengatur ulang remember token menonaktifkan login "ingat saya" di perangkat lain, tetapi sesi aktif yang sudah berjalan belum tentu langsung berakhir. Untuk pengamanan penuh, tambahkan Auth::logoutOtherDevices().
Apa bedanya reset password dengan "ganti password" di halaman profil?
Reset password dipakai saat pengguna tidak bisa login sama sekali, dan verifikasinya lewat kepemilikan email. Ganti password dipakai saat pengguna sudah login, dan verifikasinya lewat password lama plus sesi aktif. Keduanya harus ada, tetapi jangan saling menggantikan.
Penutup
Fitur lupa password yang baik terasa membosankan: pengguna memasukkan email, mengklik link, mengatur password baru, lalu kembali bekerja. Kebosanan itu justru tandanya benar.
Mulailah dari broker bawaan Laravel, kunci tiga hal — pesan yang seragam, throttle, dan masa berlaku token — lalu uji sebelum naik ke produksi. Bila Anda membangun aplikasi dari source code yang sudah jadi, periksa apakah fitur ini sudah ada dan apakah ketiga kunci itu sudah diterapkan.
Artikel Terkait
Laravel 13.39.0 Rilis 27 Oktober 2026: Model Tanpa Primary Key, restoreOrCreate & Dampaknya untuk Source Code Kamu
28 Oct 2026
WordPress 7.2 Beta 2 Dijadwalkan 27 Oktober 2026: Uji Ulang, Bukan Update Massal
28 Oct 2026
Cara Membuat Dashboard Statistik Penjualan di Laravel dengan Chart.js (Panduan Lengkap 2026)
28 Oct 2026
PHP 8.6.0 RC4 Rilis 21 Oktober 2026: 50 Perbaikan Sejak RC3 & Checklist Uji Source Code Sebelum 19 November
28 Oct 2026