Laravel Inertia 表单提交时 403 CSRF 错误的终极故障排除指南
2024-03-10 23:27:13
Laravel 中使用 Inertia 手动提交表单时的 403 CSRF 错误:终极故障排除指南
问题:403 CSRF 令牌缺失错误
在使用 Inertia 向 Laravel 应用程序提交表单时,您可能会遇到一个讨厌的 403 错误,错误信息为“This action is unauthorized”。这是因为 Laravel 通常会自动在通过 Inertia 发送的请求中包含必要的 CSRF 令牌,但出于某种原因,您的请求却失败了。
潜在原因:
- CSRF 令牌未正确包含在请求中。
- CSRF 令牌已过期或无效。
UserUpdateRequest
中缺少必要的验证规则。- 路由中间件配置不当。
解决方法:
1. 检查 Inertia 组件:
确保 router.put
调用包含 CSRF 令牌。可以手动添加令牌,如下所示:
const saveUser = () => {
router.put(`users/${user.value}`, {
headers: {
"X-CSRF-TOKEN": document.querySelector('meta[name="csrf-token"]').getAttribute('content')
}
});
submitted.value = true;
createUserDialog.value = false;
user.value = {};
};
2. 检查 Laravel 控制器:
确保 update
方法中包含必要的验证规则。更新操作可能会更改电子邮件地址,因此需要将 email
字段标记为 dirty,并将其 email_verified_at
设置为 null
。
public function update(UserUpdateRequest $request)
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users,email,' . $request->user()->id,
]);
$request->user()->fill($request->validated());
if ($request->user()->isDirty('email')) {
$request->user()->email_verified_at = null;
}
$request->user()->save();
return redirect()->route('users.index');
}
3. 检查 Laravel 路由:
确保路由中间件配置正确。路由应使用 auth
和 verified
中间件。
Route::Resource('users', UserController::class)->middleware('auth', 'verified');
4. 清除缓存:
清除 Laravel 和 Inertia 的缓存,然后尝试重新加载应用程序。
额外提示:
- 检查浏览器的控制台以获取任何错误消息。
- 确保应用程序的 CSRF 保护已正确配置。
- 尝试使用 DevTools 检查请求标头中是否包含 CSRF 令牌。
结论:
403 CSRF 令牌错误可能令人沮丧,但可以通过检查 Inertia 组件、Laravel 控制器、路由配置和其他相关设置来轻松解决。按照本指南中的步骤,您可以快速恢复正常,避免提交表单时遇到进一步的麻烦。
常见问题解答:
1. 如何知道我的请求是否包含 CSRF 令牌?
使用 DevTools 检查请求标头,您应该看到一个名为 “X-CSRF-TOKEN” 的标头,其中包含令牌的值。
2. 我需要手动添加 CSRF 令牌吗?
在大多数情况下,Laravel 会自动包含令牌。但是,如果您使用的是手动表单提交,或者遇到令牌缺失的问题,则需要手动添加它。
3. 为什么需要验证电子邮件地址?
更新电子邮件地址可能会绕过电子邮件验证,因此验证该字段非常重要。
4. 如何正确配置 Laravel 的 CSRF 保护?
请参阅 Laravel 文档了解有关如何配置 CSRF 保护的详细说明。
5. 我在哪里可以获得更多帮助?
如果您仍然遇到问题,请随时在 Laravel 论坛或 Inertia 社区中寻求帮助。