{"id":56594,"date":"2025-09-01T08:13:00","date_gmt":"2025-09-01T01:13:00","guid":{"rendered":"https:\/\/www.rumahweb.com\/journal\/?p=56594"},"modified":"2026-02-16T10:18:21","modified_gmt":"2026-02-16T03:18:21","slug":"cara-mengaktifkan-fitur-2fa-login-di-laravel","status":"publish","type":"post","link":"https:\/\/www.rumahweb.com\/journal\/cara-mengaktifkan-fitur-2fa-login-di-laravel\/","title":{"rendered":"Cara Mengaktifkan Fitur 2FA Login di Laravel"},"content":{"rendered":"\n<p>Pernah khawatir password login ke aplikasi Laravel Anda mudah dibobol? Faktanya, serangan <em>cyber <\/em>kini semakin pintar dan login dengan kata sandi saja tidak lagi aman. Di sinilah 2FA login di Laravel berperan, menambah lapisan verifikasi sehingga akun terlindungi lebih kuat. <\/p>\n\n\n\n<p>Dalam artikel ini, kami akan berbagi tentang apa itu <em>two-factor authentication<\/em> login, hingga cara mengaktifkan 2FA login di Laravel agar aplikasi semakin aman dan profesional.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mengenal Two Factor Authentication Login<\/h2>\n\n\n\n<p><em>Two Factor Authentication<\/em> (2FA) adalah sistem keamanan tambahan yang mengharuskan user untuk melewati dua tahap verifikasi sebelum berhasil login. Biasanya, tahap pertama adalah memasukkan <em>password<\/em>, lalu dilanjutkan dengan kode unik yang dikirim melalui aplikasi autentikator, SMS, atau email. <\/p>\n\n\n\n<p>Dengan cara ini, meski <em>password <\/em>bocor sekalipun, akun tetap sulit diakses tanpa kode verifikasi kedua. Dalam pengembangan aplikasi berbasis PHP, 2FA login di Laravel bisa diintegrasikan dengan mudah menggunakan package atau library tambahan, sehingga keamanan login semakin terjamin tanpa mengurangi kenyamanan pengguna.<\/p>\n\n\n\n<p>Selengkapnya tentang apa itu <em>two-factor authentication<\/em> login bisa Anda pelajari di artikel <a href=\"https:\/\/www.rumahweb.com\/journal\/2fa-adalah\/\" target=\"_blank\" rel=\"noopener\" title=\"\">berikut<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mengaktifkan 2FA Login di Laravel<\/h2>\n\n\n\n<p>Berikut adalah cara untuk mengaktifkan fitur 2FA login di <em>framework <\/em>Laravel.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1. Install Breeze Laravel<\/h3>\n\n\n\n<figure class=\"wp-block-pullquote\"><blockquote><p>Penting!<\/p><cite>Sebelum memulai, kami sarankan Anda untuk backup file webnya. Panduan ini menggunakan Laravel Framework 10.48.29.<\/cite><\/blockquote><\/figure>\n\n\n\n<p>Tahap pertama, pastikan aplikasi Laravel Anda sudah jalan. Selanjutnya, akses folder web melalui terminal dan jalankan perintah berikut:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>composer require laravel\/breeze --dev\nphp artisan breeze:install<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/breeze_laravelrumahweb.png\"><img loading=\"lazy\" decoding=\"async\" width=\"992\" height=\"335\" src=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/breeze_laravelrumahweb.png\" alt=\"Install Breeze Laravel\" class=\"wp-image-56951\" srcset=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/breeze_laravelrumahweb.png 992w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/breeze_laravelrumahweb-300x101.png 300w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/breeze_laravelrumahweb-768x259.png 768w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/breeze_laravelrumahweb-370x125.png 370w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/breeze_laravelrumahweb-270x91.png 270w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/breeze_laravelrumahweb-570x192.png 570w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/breeze_laravelrumahweb-740x250.png 740w\" sizes=\"auto, (max-width: 992px) 100vw, 992px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>Pada php artisan breeze, silahkan pilih <strong>blade<\/strong> seperti gambar diatas dan pilihlah <strong>PHPUnit<\/strong> untuk pilihan berikutnya. Langkah selanjutnya, jalankan perintah npm berikut:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install &amp;&amp; npm run dev<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2. Migrate Database Laravel<\/h3>\n\n\n\n<p>Proses selanjutnya yaitu melengkapi tabel database yang sudah ada. Jalankan perintah berikut:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php artisan make:migration add_otp_columns_to_users_table<\/code><\/pre>\n\n\n\n<p>Silahkan update isi file <strong><em>add_otp_columns_to_users_table<\/em><\/strong> dalam folder <strong><em>database\\migrations<\/em><\/strong> dengan <em>script <\/em>dibawah:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    public function up(): void\n    {\n        Schema::table('users', function (Blueprint $table) {\n        $table-&gt;boolean('otp_enabled')-&gt;default(false);\n        $table-&gt;string('otp_code')-&gt;nullable();\n        $table-&gt;timestamp('otp_expires_at')-&gt;nullable();\n        });\n    }\n\n    public function down(): void\n    {\n        Schema::table('users', function (Blueprint $table) {\n        });\n    }\n};<\/code><\/pre>\n\n\n\n<p>Perhatikan bagian &#8220;<strong><span style=\"text-decoration: underline;\">Schema::table(&#8216;users&#8217;<\/span><\/strong>&#8220;, silahkan disesuaikan dengan nama table database Anda jika tidak menggunakan <strong>users<\/strong>. Jalankan perintah berikut jika kodenya telah disesuaikan:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php artisan migrate<\/code><\/pre>\n\n\n\n<p>jika proses migrate database tidak mengalami kendala, silahkan lanjutkan ke langkah berikutnya.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3. Aktifkan SendOTP Laravel dan View Emails<\/h3>\n\n\n\n<p>Langkah berikutnya dengan mengaktifkan sendOTP yang berfungsi sebagai metode pengiriman kode ke emailnya. Jalankan perintah berikut:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php artisan make:mail SendOTP<\/code><\/pre>\n\n\n\n<p>Proses berikutnya silahkan Anda masuk ke folder <strong><em>resources\\views<\/em><\/strong> , buatlah folder baru dengan nama <strong>emails<\/strong> dengan isi file bernama <strong>otp.blade.php<\/strong><\/p>\n\n\n\n<p>Berikut isi dari <em>script <\/em>otp.blade.php yang bisa Anda gunakan:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;div style=\"font-family: Arial, sans-serif; background-color: #f4f4f4; padding: 30px; color: #333;\"&gt;\n    &lt;div style=\"max-width: 600px; margin: 0 auto; background-color: #ffffff; border-radius: 8px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); padding: 30px;\"&gt;\n\n        &lt;h1 style=\"font-size: 24px; color: #4F46E5; text-align: center; margin-bottom: 20px;\"&gt;Verifikasi Kode OTP Anda&lt;\/h1&gt;\n        &lt;p style=\"font-size: 16px; text-align: center;\"&gt;Berikut adalah kode OTP yang Anda minta untuk verifikasi:&lt;\/p&gt;\n\n        &lt;div style=\"text-align: center; margin: 30px 0;\"&gt;\n            &lt;span style=\"display: inline-block; background-color: #4F46E5; color: #ffffff; font-size: 32px; font-weight: bold; padding: 12px 24px; border-radius: 8px; letter-spacing: 4px;\"&gt;\n                {{ $otp }}\n            &lt;\/span&gt;\n        &lt;\/div&gt;\n\n        &lt;p style=\"font-size: 14px; text-align: center; color: #666;\"&gt;\n            Kode ini berlaku selama &lt;strong&gt;5 menit&lt;\/strong&gt;. Jangan berikan kode ini kepada siapa pun.\n        &lt;\/p&gt;\n\n        &lt;hr style=\"margin: 30px 0; border: none; border-top: 1px solid #e0e0e0;\"&gt;\n\n        &lt;p style=\"font-size: 12px; text-align: center; color: #999;\"&gt;\n            Jika Anda tidak meminta kode ini, Anda bisa mengabaikan email ini atau menghubungi admin: admin@fredriclesomar.id\n        &lt;\/p&gt;\n\n    &lt;\/div&gt;\n&lt;\/div&gt;<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/OTP-Laravel_rumahweb.png\"><img loading=\"lazy\" decoding=\"async\" width=\"632\" height=\"397\" src=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/OTP-Laravel_rumahweb.png\" alt=\"Mengaktifkan SendOTP Laravel dan View Emails\" class=\"wp-image-56873\" style=\"width:546px;height:auto\" srcset=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/OTP-Laravel_rumahweb.png 632w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/OTP-Laravel_rumahweb-300x188.png 300w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/OTP-Laravel_rumahweb-370x232.png 370w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/OTP-Laravel_rumahweb-270x170.png 270w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/OTP-Laravel_rumahweb-570x358.png 570w\" sizes=\"auto, (max-width: 632px) 100vw, 632px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>Tampilan diatas adalah form ketika kode OTP dikirimkan ke email terdaftar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4. Buat file View Auth<\/h3>\n\n\n\n<p>Langkah berikutnya dengan membuat file baru dengan nama <strong>otp-verify.blade.php<\/strong> di dalam folder <strong>resources\\views\\auth<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;x-guest-layout&gt;\n    &lt;div class=\"min-h-screen flex items-center justify-center bg-gray-100 dark:bg-gray-900\"&gt;\n        &lt;div class=\"w-full max-w-md bg-white dark:bg-gray-800 p-8 rounded-lg shadow-lg space-y-6\"&gt;\n\n            {{-- Header --}}\n            &lt;div class=\"text-center\"&gt;\n                &lt;div class=\"mx-auto w-16 h-16 flex items-center justify-center rounded-full bg-indigo-100 dark:bg-indigo-500 text-indigo-600 dark:text-white mb-4\"&gt;\n                    &lt;svg class=\"w-8 h-8\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n                         viewBox=\"0 0 24 24\"&gt;\n                        &lt;path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n                              d=\"M16 12a4 4 0 01-8 0m8 0a4 4 0 00-8 0m8 0V6a4 4 0 00-8 0v6m8 0l4 4m-4-4l-4 4\"\/&gt;\n                    &lt;\/svg&gt;\n                &lt;\/div&gt;\n                &lt;h2 class=\"text-xl font-semibold text-gray-800 dark:text-white\"&gt;Verifikasi OTP&lt;\/h2&gt;\n                &lt;p class=\"mt-1 text-sm text-gray-600 dark:text-gray-400\"&gt;\n                    Periksa email Anda untuk mendapatkan kode OTP.\n                &lt;\/p&gt;\n            &lt;\/div&gt;\n\n            {{-- Alert Jika Link Terkirim --}}\n            @if (session('status') == 'verification-link-sent')\n                &lt;div class=\"p-3 text-sm text-green-700 bg-green-100 rounded dark:bg-green-700 dark:text-green-100\"&gt;\n                    Tautan verifikasi baru telah dikirim ke email Anda.\n                &lt;\/div&gt;\n            @endif\n\n            {{-- Form OTP --}}\n            &lt;form method=\"POST\" action=\"{{ route('otp.verify') }}\" class=\"space-y-4\"&gt;\n                @csrf\n\n                &lt;div&gt;\n                    &lt;label for=\"otp\" class=\"block text-sm font-medium text-gray-700 dark:text-gray-300\"&gt;\n                        Masukkan Kode OTP\n                    &lt;\/label&gt;\n                    &lt;input\n                        type=\"text\"\n                        name=\"otp\"\n                        id=\"otp\"\n                        required\n                        placeholder=\"Contoh: 123456\"\n                        class=\"mt-1 block w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm text-gray-900 dark:text-white dark:bg-gray-700 focus:ring-indigo-500 focus:border-indigo-500\"\n                    &gt;\n                &lt;\/div&gt;\n\n                &lt;button\n                    type=\"submit\"\n                    class=\"w-full inline-flex justify-center items-center px-4 py-2 bg-indigo-600 hover:bg-indigo-700 text-white text-sm font-medium rounded-md shadow focus:outline-none focus:ring-2 focus:ring-indigo-500\"\n                &gt;\n                    Verifikasi\n                &lt;\/button&gt;\n            &lt;\/form&gt;\n\n            {{-- Kirim Ulang --}}\n            &lt;form method=\"POST\" action=\"{{ route('verification.send') }}\" class=\"text-center\"&gt;\n                @csrf\n                &lt;button type=\"submit\"\n                        class=\"text-sm text-indigo-600 hover:text-indigo-800 dark:text-indigo-400 dark:hover:text-indigo-200 hover:underline mt-2\"&gt;\n                    Kirim Ulang Kode OTP\n                &lt;\/button&gt;\n            &lt;\/form&gt;\n\n            {{-- Logout --}}\n            &lt;form method=\"POST\" action=\"{{ route('logout') }}\" class=\"text-center\"&gt;\n                @csrf\n                &lt;button type=\"submit\"\n                        class=\"text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-white underline\"&gt;\n                    Log Out\n                &lt;\/button&gt;\n            &lt;\/form&gt;\n\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n&lt;\/x-guest-layout&gt;<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/OTP-Laravel-page_rumahweb.png\"><img loading=\"lazy\" decoding=\"async\" width=\"423\" height=\"348\" src=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/OTP-Laravel-page_rumahweb.png\" alt=\"Contoh tampilan 2FA login di Laravel\" class=\"wp-image-56880\" srcset=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/OTP-Laravel-page_rumahweb.png 423w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/OTP-Laravel-page_rumahweb-300x247.png 300w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/OTP-Laravel-page_rumahweb-370x304.png 370w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/OTP-Laravel-page_rumahweb-270x222.png 270w\" sizes=\"auto, (max-width: 423px) 100vw, 423px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Step 5. Buat File Mail SendOTP<\/h3>\n\n\n\n<p>Langkah berikutnya dengan mengupdate isi file <strong>SendOTP.php<\/strong> dalam folder <code>app\/Mail\/<\/code> yang sudah Anda buat di step 3 sebelumnya.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/SendOTP-laravel.png\"><img loading=\"lazy\" decoding=\"async\" width=\"774\" height=\"88\" src=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/SendOTP-laravel.png\" alt=\"Buat File Mail SendOTP\" class=\"wp-image-56954\" srcset=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/SendOTP-laravel.png 774w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/SendOTP-laravel-300x34.png 300w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/SendOTP-laravel-768x87.png 768w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/SendOTP-laravel-370x42.png 370w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/SendOTP-laravel-270x31.png 270w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/SendOTP-laravel-570x65.png 570w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/SendOTP-laravel-740x84.png 740w\" sizes=\"auto, (max-width: 774px) 100vw, 774px\" \/><\/a><\/figure>\n<\/div>\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\nnamespace App\\Mail;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Mail\\Mailable;\nuse Illuminate\\Mail\\Mailables\\Content;\nuse Illuminate\\Mail\\Mailables\\Envelope;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Http\\Request;\n\nclass SendOTP extends Mailable\n{\n    use Queueable, SerializesModels;\n\n\tpublic $otp;\n\tpublic function __construct($otp) { $this-&gt;otp = $otp; }\n\n\tpublic function build()\n{\n\t\treturn $this-&gt;subject('Kode OTP Login')-&gt;view('emails.otp');\n\t}\n\n\n    public function envelope(): Envelope\n    {\n        return new Envelope(\n            subject: 'Send O T P',\n        );\n    }\n\n    public function content(): Content\n    {\n        return new Content(\n            view: 'emails.otp',\n        );\n    }\n\n    public function attachments(): array\n    {\n        return &#91;];\n    }\n}<\/code><\/pre>\n\n\n\n<p>File diatas berkaitan dengan proses pengiriman email, dan bagian <strong>subject: <\/strong>adalah <em>subject <\/em>email yang akan dikirimkan. Sedangkan <strong>view:<\/strong> adalah lokasi dari body\/template email yang telah dibuat sebelumnya dalam folder <strong>emails <\/strong>&gt; <strong>otp.blade.php<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 6. Perbarui Routes Laravel<\/h3>\n\n\n\n<p>Untuk memastikan semua fungsi email dapat berjalan dengan baik, silahkan <em>update routes <\/em>Laravel Anda di file <strong>web.php<\/strong> dengan menambahkan konfig berikut:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\nuse App\\Http\\Controllers\\ProfileController;\nuse Illuminate\\Support\\Facades\\Route;\nuse Illuminate\\Support\\Facades\\Auth;\nuse Illuminate\\Http\\Request;\n\n{routes lama Anda}\n...\nRoute::get('\/otp-verify', function () {\n    return view('auth.otp-verify');\n})-&gt;name('otp.verify.form');\n\nRoute::post('\/otp-verify', function (Request $req) {\n    $req-&gt;validate(&#91;'otp' =&gt; 'required|numeric']);\n\n    $user = \\App\\Models\\User::find(session('otp_user_id'));\n\n    if (!$user || $user-&gt;otp_code !== $req-&gt;otp || now()-&gt;gt($user-&gt;otp_expires_at)) {\n        return back()-&gt;withErrors(&#91;'otp' =&gt; 'OTP salah atau kadaluarsa']);\n    }\n\n    \/\/ aktifkan reset OTP disini\n    $user-&gt;otp_code = null;\n    $user-&gt;otp_expires_at = null;\n    $user-&gt;save();\n\n    Auth::login($user);\n    session()-&gt;forget('otp_user_id');\n\n    return redirect()-&gt;route('dashboard');\n})-&gt;name('otp.verify');\n\nrequire __DIR__.'\/auth.php';\n<\/code><\/pre>\n\n\n\n<p>Silahkan sesuaikan <em>script <\/em>diatas dalam <em>routes <\/em>Laravel Anda, pastikan bagian OTP berada dibagian bawah setelah <em>route <\/em>login.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 7. Perbarui Controller Auth<\/h3>\n\n\n\n<p>Di langkah ke tujuh ini, Anda perlu update file <strong>AuthenticatedSessionController.php<\/strong> di folder <strong>app\\Http\\Controllers\\Auth<\/strong>. Silahkan sesuaikan <em>default <\/em>kodenya dengan <em>script <\/em>di bawah:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Models\\User;\nuse App\\Http\\Controllers\\Controller;\nuse App\\Http\\Requests\\Auth\\LoginRequest;\nuse App\\Providers\\RouteServiceProvider;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Auth;\nuse Illuminate\\View\\View;\nuse Illuminate\\Support\\Facades\\Hash;\nuse Illuminate\\Validation\\ValidationException;\nuse Illuminate\\Support\\Facades\\Mail;\n\n{script default}\n...\n    public function store(LoginRequest $request): RedirectResponse\n    {\n    $request-&gt;validate(&#91;\n        'email' =&gt; &#91;'required', 'email'],\n        'password' =&gt; &#91;'required'],\n    ]);\n\n    $user = User::where('email', $request-&gt;email)-&gt;first();\n\n    if (!$user || !Hash::check($request-&gt;password, $user-&gt;password)) {\n        throw ValidationException::withMessages(&#91;\n            'email' =&gt; __('auth.failed'),\n        ]);\n    }\n\n    if ($user-&gt;otp_enabled) {\n        $otp = rand(100000, 999999);\n        $user-&gt;otp_code = $otp;\n        $user-&gt;otp_expires_at = now()-&gt;addMinutes(5);\n        $user-&gt;save();\n\n        Mail::to($user-&gt;email)-&gt;send(new \\App\\Mail\\SendOTP($otp));\n\n        session(&#91;'otp_user_id' =&gt; $user-&gt;id]);\n\n        return redirect()-&gt;route('otp.verify.form');\n    }\n\n    Auth::login($user, $request-&gt;boolean('remember'));\n\n    $request-&gt;session()-&gt;regenerate();\n\n    return redirect()-&gt;intended(RouteServiceProvider::HOME);\n    }\n<\/code><\/pre>\n\n\n\n<p>Silahkan Anda sesuaikan <em>script <\/em>di atas, jika belum ada maka perlu ditambahkan dan diperbarui.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 8. Tambahkan tombol Enable 2FA di Profile<\/h3>\n\n\n\n<p>Langkah terakhir, tambahkan tombol 2FA di profile dengan file <strong>edit.blade.php<\/strong> yang berada dalam folder <code>\\resources\\views\\profile<\/code>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/2FAemail-laravel.png\"><img loading=\"lazy\" decoding=\"async\" width=\"315\" height=\"169\" src=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/2FAemail-laravel.png\" alt=\"Tambahkan tombol Enable 2FA di Profile\" class=\"wp-image-57000\" style=\"width:278px;height:auto\" srcset=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/2FAemail-laravel.png 315w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/2FAemail-laravel-300x161.png 300w, https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/2FAemail-laravel-270x145.png 270w\" sizes=\"auto, (max-width: 315px) 100vw, 315px\" \/><\/a><\/figure>\n<\/div>\n\n\n<pre class=\"wp-block-code\"><code>&lt;div class=\"py-12\"&gt;\n    &lt;div class=\"max-w-7xl mx-auto sm:px-6 lg:px-8 space-y-6\"&gt;\n     &lt;div class=\"p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg\"&gt;\n            &lt;div class=\"max-w-xl\"&gt;\n                @include('profile.partials.update-profile-information-form')\n            &lt;\/div&gt;\n     &lt;\/div&gt;\n\n     &lt;div class=\"p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg\"&gt;\n            &lt;div class=\"max-w-xl\"&gt;\n                @include('profile.partials.update-password-form')\n            &lt;\/div&gt;\n     &lt;\/div&gt;\n     &lt;div class=\"p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg\"&gt;\n            &lt;div class=\"max-w-xl\"&gt;\n    &lt;div class=\"p-6 text-gray-900 dark:text-gray-100\"&gt;\n        @if (!auth()-&gt;user()-&gt;otp_enabled)\n    &lt;form method=\"POST\" action=\"{{ route('otp.enable') }}\"&gt;\n        @csrf\n    &lt;x-primary-button&gt;Aktifkan 2FA Email&lt;\/x-primary-button&gt;\n    &lt;\/form&gt;\n        @else\n    &lt;p&gt;2FA melalui Email telah Aktif&lt;\/p&gt;\n        @endif\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n        &lt;\/div&gt;\n     &lt;div class=\"p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg\"&gt;\n            &lt;div class=\"max-w-xl\"&gt;\n                @include('profile.partials.delete-user-form')\n            &lt;\/div&gt;\n     &lt;\/div&gt;    \n   &lt;\/div&gt;\n&lt;\/div&gt;<\/code><\/pre>\n\n\n\n<p>Apabila semua langkah telah dilakukan, silahkan bersihkan <em>cache <\/em>dari <em>config<\/em>, <em>view<\/em>, <em>route <\/em>dan lakukan optimize dengan perintah berikut:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php artisan optimize<\/code><\/pre>\n\n\n\n<p>Untuk hasil pengujiannya bisa Anda lihat pada video berikut.<\/p>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video height=\"608\" style=\"aspect-ratio: 1278 \/ 608;\" width=\"1278\" controls src=\"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/2FAemail.webm\"><\/video><\/figure>\n\n\n\n<p>Apabila semua langkah diatas telah selesai semua, Anda perlu memastikan kembali settingan email di file .ENV telah sesuai untuk mengirim email.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Penutup<\/h2>\n\n\n\n<p>Keamanan aplikasi adalah hal yang tidak boleh dianggap sepele. Dengan menerapkan 2FA Login di Laravel, Anda menambahkan lapisan perlindungan ekstra yang mampu mencegah akses ilegal sekaligus meningkatkan kepercayaan pengguna. Jadi, pastikan fitur ini menjadi bagian dari aplikasi Anda agar data tetap aman dan aplikasi terlihat lebih profesional.<\/p>\n\n\n\n<p>Dan jika Anda butuh hosting yang aman sekaligus dilengkapi fitur keamanan lengkap, <strong><a href=\"https:\/\/www.rumahweb.com\/hosting-murah\/\" target=\"_blank\" rel=\"noopener\" title=\"\">hosting <\/a><\/strong>dari Rumahweb adalah solusinya. Layanan hosting kami sudah dibekali antivirus Monarx, SSL gratis, hingga sistem keamanan berlapis, sehingga jauh lebih aman dibanding hosting standar pada umumnya. Dengan begitu, aplikasi Laravel Anda tidak hanya aman dari sisi kode, tapi juga dari sisi server tempatnya berjalan.<\/p>\n\n\n\n<p>Itu dia panduan kami tentang cara mengaktifkan 2FA login di Laravel <em>framework<\/em>, semoga bermanfaat.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pernah khawatir password login ke aplikasi Laravel Anda mudah dibobol? Faktanya, serangan cyber kini semakin pintar dan login dengan kata sandi saja tidak lagi aman. Di sinilah 2FA login di Laravel berperan, menambah lapisan verifikasi sehingga akun terlindungi lebih kuat. Dalam artikel ini, kami akan berbagi tentang apa itu two-factor authentication login, hingga cara mengaktifkan [&hellip;]<\/p>\n","protected":false},"author":338,"featured_media":57145,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[7],"tags":[1327,796,1328],"class_list":{"0":"post-56594","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-web-programming","8":"tag-2fa","9":"tag-laravel","10":"tag-two-factor-authentication"},"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.rumahweb.com\/journal\/wp-content\/uploads\/2025\/08\/Banner-Cara-Mengaktifkan-Fitur-2FA-Login-di-Laravel.png","jetpack_shortlink":"https:\/\/wp.me\/p8n3G7-eIO","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.rumahweb.com\/journal\/wp-json\/wp\/v2\/posts\/56594","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rumahweb.com\/journal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rumahweb.com\/journal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rumahweb.com\/journal\/wp-json\/wp\/v2\/users\/338"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rumahweb.com\/journal\/wp-json\/wp\/v2\/comments?post=56594"}],"version-history":[{"count":5,"href":"https:\/\/www.rumahweb.com\/journal\/wp-json\/wp\/v2\/posts\/56594\/revisions"}],"predecessor-version":[{"id":61874,"href":"https:\/\/www.rumahweb.com\/journal\/wp-json\/wp\/v2\/posts\/56594\/revisions\/61874"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.rumahweb.com\/journal\/wp-json\/wp\/v2\/media\/57145"}],"wp:attachment":[{"href":"https:\/\/www.rumahweb.com\/journal\/wp-json\/wp\/v2\/media?parent=56594"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rumahweb.com\/journal\/wp-json\/wp\/v2\/categories?post=56594"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rumahweb.com\/journal\/wp-json\/wp\/v2\/tags?post=56594"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}