Laravel结合Inertia测试表单提交报419 CSRF令牌不匹配问题
Laravel + Inertia + Fortify 表单测试419 CSRF报错解决方案
问题背景
- 项目技术栈为Laravel + Inertia + Laravel Fortify,用于实现用户账户模块
- 浏览器手动操作注册等表单功能一切正常,运行自动化测试时接口返回419状态码,错误信息为 CSRF token mismatch
- 前端正常的原因是Inertia默认会自动处理CSRF令牌的携带逻辑,不需要前端手动配置
- 问题排查方式:测试代码中执行
$response->dump();打印响应,确认错误属于CSRF校验不通过
原有测试代码
$response = $this->get('/register') ->assertStatus(200); $response = $this->json('POST', '/register', [ 'name' => 'Example Name', 'email' => 'example@example.com', 'password' => 'password', 'password_confirmation' => 'password' ]); $response->assertCreated();
核心问题与修复方案
1. 419报错原因与修复
测试环境下Laravel默认启用CSRF中间件校验,测试代码直接发起POST请求时没有携带有效CSRF令牌,自然会被拦截,和前端Inertia的自动处理逻辑不冲突——前端流程中Inertia会自动从cookie读取令牌附加到请求头,测试请求没有走这个前端逻辑。
修复方式优先选择测试时临时跳过CSRF中间件,不需要修改全局安全配置,也不会影响生产环境逻辑:
// 引入CSRF中间件类,或者直接传类名字符串 use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken; // 发起请求前调用withoutMiddleware跳过指定中间件 $this->withoutMiddleware(VerifyCsrfToken::class);
2. 测试写法修正
原有测试写法存在两个明显错误:
- 错误使用
$this->json()发起请求:Inertia提交的不是纯JSON接口请求,是携带X-Inertia头的普通POST请求,直接用Laravel测试提供的$this->post()方法即可。 - 响应断言错误:Fortify注册流程完成后默认返回302重定向响应,不是201创建成功状态,
assertCreated()断言不成立,需要改为断言重定向到注册成功后的目标页面,同时补充登录状态、数据库写入的断言。
修正后的标准测试代码参考:
public function test_user_register_success() { $this->withoutMiddleware(VerifyCsrfToken::class); // 访问注册页断言正常 $this->get('/register')->assertOk(); $userInfo = [ 'name' => 'Example Name', 'email' => 'example@example.com', 'password' => 'password', 'password_confirmation' => 'password' ]; $response = $this->post('/register', $userInfo); // 断言重定向到项目配置的注册后首页,常见为/dashboard $response->assertRedirect('/dashboard'); // 断言用户已经登录 $this->assertAuthenticated(); // 断言用户数据已经写入数据库 $this->assertDatabaseHas('users', [ 'email' => $userInfo['email'], 'name' => $userInfo['name'] ]); }
3. 测试工具选择建议
不需要所有表单场景都用Laravel Dusk,按测试目标选型即可:
- 仅验证后端业务逻辑(字段校验、数据存储、权限判断、流程跳转)时,用Laravel内置的功能测试即可,执行速度快,维护成本低,覆盖大部分测试场景。
- 需要验证前端交互全流程(表单实时校验、Inertia页面渲染、浏览器端实际操作体验、UI元素展示)时,再使用Laravel Dusk做端到端测试,这类测试执行速度慢,适合覆盖核心用户路径即可。
内容的提问来源于stack exchange,提问作者thairish
相关产品推荐
相关产品推荐

