Postman调用Laravel Passport登录接口出现CSRF token mismatch错误
问题原因
- 你将API认证路由定义在了
routes/web.php文件中,Laravel默认给web路由组全局加载了VerifyCsrfToken中间件,所有POST类型的web路由请求都要求携带合法CSRF令牌,Postman调用时未传递该令牌因此触发校验失败报错。 - Passport属于API身份认证方案,本身就不适合挂载到web路由组的规则下,web路由组的CSRF校验是为前后端不分离的web页面场景设计的,API场景无需该校验。
解决方案
推荐方案(生产环境可用)
将你的auth相关路由从routes/web.php移动到routes/api.php文件中:
Route::group(['prefix' => 'auth'], function() { Route::post('/login', [AuthController::class, 'login'])->name('login'); Route::post('/register', [AuthController::class, 'register'])->name('register'); });
- Laravel的api路由组默认不会加载CSRF校验中间件,同时会自动给所有路由加
/api前缀,调整后Postman的请求地址改为http://127.0.0.1:8000/api/auth/login即可,其余请求头、请求体配置不需要改动。 - 请提前确认
config/auth.php配置文件中,guards.api.driver参数已设置为passport,符合Passport的配置要求。
临时调试方案(不推荐生产环境使用)
如果一定要保留路由在routes/web.php中,可以将auth相关路径加入CSRF校验排除列表:
打开app/Http/Middleware/VerifyCsrfToken.php文件,修改$except属性:
protected $except = [ '/auth/*', ];
注意:该方案会关闭对应路由的CSRF防护,存在跨站请求伪造安全风险,仅可用于本地调试,不可在生产环境使用。
内容的提问来源于stack exchange,提问作者sabunan
相关产品推荐
相关产品推荐

