Menangani Error 419 di Laravel
Menangani Error 419 Page Expired Laravel
Sebagai programmer yang ngoding Laravel, kita kayaknya gak asing dengan error 419 Page Expired
ketika kita membuat aplikasi dengan Laravel.
Ini sering terjadi karena sebuah masalah sederhana yang berhubungan dengan token CSRF (Cross-Site Request Forgery)
.
Mengapa 419 Page Expired terjadi dan bagaimana mengatasinya
Pada aplikasi Laravel yang kita buat versi berapapun kita seharusnya menggunakan directive @csrf
pada setiap form yang kita miliki.
@csrf
ini akan membuat sebuah inputan tersembunyi <input type="hidden" ..../>
yang berisi token CSRF secara otomatis ketika form disubmit.
Token ini digunakan untuk memastikan bahwa form yang disubmit berasal dari aplikasi kita dan bukan dari pihak ketiga (3rd party).
Lalu, apa sih yang menyebabkan error 419 Page Expired
ini terjadi ? biasanya karena token yang dikirim nggak cocok, bisa terjadi karena beberapa alasan.
- Terkadang, kita sudah membuka sebuah halaman form, dan membiarkannya dalam waktu yang cukup lama dan token yang dibuat sudah expired. Ini adalah sebuah hal yang baik, walaupun dulunya saya ingin menghilangkan hal seperti ini, kalau gak salah ada sebuah package yang membantu supaya tokenya jadi valid dalam waktu yang lama. Tapi makin kesini paham bahwa hal tersebut malah kurang baik buat keamanan, jadi kalau memang halamannya ditinggal dalam waktu yang lama ya harusnya seperti itu
419 Page Expired
. Solusinya pun sangat sederhana, cukup refresh browser dan submit ulang formnya. - Yang kedua, mungkin saja kita lupa menambahkan directive
@csrf
dalam form kita. Ini yang sering saya temui dan kadang saya lakukan sendiri :D, padahal udah lama banget ngoding Laravel. Untungnya ada middlewareVerifyCsrfToken.php
yang memfilter request yang masuk dengan memberi error419 Page Expired
, yang walaupun terkadang menjengkelkan juga wkwk
Menonaktifkan CSRF pada beberapa halaman
Pada suatu waktu, pernah kejadian integrasi dengan API pihak ketiga yang membutuhkan webhook dari aplikasi kita. Dan webhooknya tidak berupa request API dengan JSON atau apalah ya, tapi berupa sebuah form dari aplikasi kita yang memiliki inputan sesuai yang mereka inginkan dan inputannya semua dihide / hidden.
Jika punya kejadian seperti pengalaman saya tersebut, kita bisa menonaktifkan CSRF pada beberapa halaman, yang pasti jangan menonaktfikan middleware VerifyCsrfToken
secara keseluruhan ya :D.
Nah untuk kebutuhan tersebut, kita bisa menambahkan pengecualian pada file VerfiyCsrfToken.php
yang ada pada app/Http/Middleware
.
namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; class VerifyCsrfToken extends Middleware { /** * The URIs that should be excluded from CSRF verification. * * @var array<int, string> */ protected $except = [ '/halaman', '/halaman-lainnya', ]; }