Thực hiện request
Laravel tự động thêm CSRF token phù hợp khi thực hiện request qua Inertia hoặc Axios. Tuy nhiên, nếu dùng Laravel, hãy nhớ bỏ thẻ metacsrf-token khỏi dự án vì thẻ này sẽ ngăn CSRF token được làm mới đúng cách.
Nếu framework phía máy chủ có bảo vệ cross-site request forgery (CSRF), bạn cần đảm bảo mỗi request Inertia đều chứa CSRF token cần thiết cho POST, PUT, PATCH và DELETE.
Một số server-side framework như Laravel tự động đưa CSRF token vào request. Khi dùng các framework này, bạn không cần cấu hình bổ sung.
Tuy nhiên, nếu cần tự xử lý bảo vệ CSRF, một cách là gửi CSRF token dưới dạng prop trong mọi response. Sau đó bạn có thể sử dụng token này khi thực hiện request Inertia.
csrf_token vào mỗi response.
Một cách tốt hơn là dùng cơ chế xử lý XSRF token tích hợp sẵn của Inertia. HTTP client của Inertia tự động kiểm tra cookie XSRF-TOKEN và, nếu tồn tại, đưa token vào header X-XSRF-TOKEN cho mọi request.
Cách dễ nhất để triển khai là dùng middleware phía server. Chỉ cần đưa cookie XSRF-TOKEN vào mỗi response, sau đó xác minh token bằng header X-XSRF-TOKEN được gửi trong các request từ Inertia.
Bạn có thể tùy chỉnh tên cookie và header thông qua tùy chọn http trong createInertiaApp.
Xử lý token không khớp
Khi CSRF token không khớp, framework phía server thường ném exception dẫn đến error response. Ví dụ, Laravel némTokenMismatchException, tạo ra trang lỗi 419. Vì đây không phải response Inertia hợp lệ, lỗi sẽ được hiển thị trong modal.
Rõ ràng đây không phải trải nghiệm tốt cho người dùng. Cách xử lý tốt hơn là redirect về trang trước kèm flash message cho biết trang đã hết hạn. Kết quả sẽ là một response Inertia hợp lệ, trong đó flash message có sẵn dưới dạng prop để bạn hiển thị cho người dùng. Tất nhiên, bạn cần chia sẻ flash message với Inertia để cách này hoạt động.
Khi dùng Laravel, bạn có thể chỉnh exception handler của ứng dụng để tự động redirect người dùng về trang trước và flash message vào session. Bạn có thể thực hiện việc này bằng phương thức exception respond trong file bootstrap/app.php.