Tidak dapat menggunakan Laravel Sanctum pada bahagian hadapan untuk menjana kuki CSRF
P粉099985373
2023-08-26 19:05:10
<p>Baru-baru ini saya cuba menggunakan Laravel Sanctum untuk pengesahan dalam Nuxt 3 tetapi menghadapi masalah semasa jabat tangan kuki CSRF awal. Masalahnya ialah selepas saya membuat permintaan kepada laluan <code>http://localhost:8000/sanctum/csrf-cookie</code>, kuki XSRF-TOKEN tidak ditetapkan oleh penyemak imbas. Saya telah terperangkap dalam masalah ini selama seminggu sekarang dan tidak menemui penyelesaian di internet.
Saya cuba menggunakan Axios dan Fetch API untuk menetapkan XSRF-TOKEN tanpa kejayaan. Saya menggunakan <code>http://localhost:8000</code> pada bahagian belakang dan <code>http://localhost:3000</code> Laravel Sanctum sendiri berfungsi dengan baik kerana semasa menguji Posman saya menerima pengepala set-kuki tetapi bukan pelayar. Saya menetapkan sifat berikut dalam fail <code>.env</code>
<pre class="brush:php;toolbar:false;">FRONTEND_URL=http://localhost:3000
SESSION_DOMAIN=localhost:3000
SESSION_DRIVER=kuki</pra>
<p>Saya telah berusaha sedaya upaya untuk mengatasi batasan permintaan CORS di bahagian hadapan. Fungsi pengambilan saya kelihatan seperti ini: </p>
<pre class="brush:php;toolbar:false;">window.fetch('http://localhost:8000/sanctum/csrf-cookie', {
kelayakan: 'termasuk',
}).then((respons) => {
console.log(…response.headers)
})</pre>
<p>Saya telah membaca bahawa menetapkan kelayakan untuk 'termasuk' boleh menyelesaikan masalah, tetapi walaupun dengan itu, saya masih tidak dapat menetapkan XSRF-TOKEN. Saya cuba menetapkan kelayakan kepada 'asal yang sama' tetapi itu juga tidak berjaya. Adakah sesiapa tahu bagaimana untuk menyelesaikan masalah ini? </p>
Masalahnya ialah penyemak imbas tidak akan menerima kuki dari port yang berbeza.
Memandangkan bahagian belakang anda berjalan pada port 8000 dan bahagian hadapan berjalan pada port 3000, kuki yang disediakan oleh bahagian belakang tidak akan ditetapkan pada bahagian hadapan.
Jadi, penyelesaian adalah untuk melumpuhkan perlindungan CSRF hanya untuk titik akhir API. Anda boleh melakukan ini dalam
VerifyCsrfToken
middleware.Tambahkan baris ini pada
$except
array anda dan anda boleh pergi.