返回

Laravel Inertia 表单提交时 403 CSRF 错误的终极故障排除指南

vue.js

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 路由:

确保路由中间件配置正确。路由应使用 authverified 中间件。

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 社区中寻求帮助。