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.
Tất nhiên, như đã đề cập, một số framework phía máy chủ như Laravel tự động xử lý việc đưa CSRF token vào request. Vì vậy, 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 trong mỗi response.
Tuy nhiên, cách tốt hơn là tận dụng chức năng CSRF có sẵn trong axios. Axios là thư viện HTTP mà Inertia sử dụng bên dưới.
Axios tự động kiểm tra cookie XSRF-TOKEN có tồn tại hay không. Nếu có, nó sẽ gửi token trong header X-XSRF-TOKEN cho mọi request được tạo.
Cách dễ nhất để triển khai là dùng middleware phía máy chủ. Chỉ cần gửi cookie XSRF-TOKEN trong mỗi response, sau đó xác minh token bằng header X-XSRF-TOKEN được Axios gửi trong request.
Xử lý token không khớp
Khi CSRF token không khớp, framework phía máy chủ thường ném exception dẫn đến response lỗi. Ví dụ, khi dùng Laravel,TokenMismatchException được ném và dẫn đến trang lỗi 419. Vì đây không phải response Inertia hợp lệ nên 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.