Laravel API 结合 React 发起POST请求返回401未授权求助
首先要明确:401是身份验证失败,不是CSRF令牌问题(CSRF验证失败通常返回419状态码),所以咱们的排查重点要从身份验证入手,而不是继续纠结CSRF配置。下面是具体的排查步骤:
检查路由是否被身份验证中间件包裹
你提到路由没添加中间件,但要注意Laravel的api.php路由文件默认是被auth:api中间件组包裹的(可以查看RouteServiceProvider里的配置确认)。如果你的klippekort路由是在默认的Route::apiResource或者Route::middleware('auth:api')组里,那后端会要求请求携带有效的API认证凭证,否则就返回401。
解决方法:把这个路由移出认证中间件组,或者确保前端请求带上正确的认证信息。确认fetch请求是否携带会话凭证(如果用Session认证)
如果你的项目用的是传统Session认证(而非API Token),fetch API默认不会自动发送Cookie,导致后端无法识别用户身份,返回401。你需要在fetch选项里添加credentials: 'include':fetch('api/klippekort', { method: 'POST', credentials: 'include', // 新增这一行 headers: { 'X-CSRF-TOKEN': this.props.csrf_token, 'Accept': 'application/json', 'Content-Type': 'application/json', }, body: JSON.stringify({ to_user, hours_spend, hours_max }) }).then(res => console.log(res))查看Laravel日志定位具体原因
打开storage/logs/laravel.log,找到对应请求的错误日志,里面会明确告诉你是哪个中间件触发的401(比如auth:api还是其他自定义中间件),这能帮你快速锁定问题点。用工具直接测试路由
用POSTMAN或者curl发送POST请求到http://localhost/api/klippekort,不带任何认证信息,看看返回结果:- 如果还是401:说明路由确实要求身份验证,要么移除中间件,要么在请求中带上正确的凭证(比如用API Token的话,要在headers里加
Authorization: Bearer {你的Token})。 - 如果返回其他状态码(比如422、200):那问题出在前端请求的凭证携带上,检查认证信息是否正确传递。
- 如果还是401:说明路由确实要求身份验证,要么移除中间件,要么在请求中带上正确的凭证(比如用API Token的话,要在headers里加
最后再确认CSRF配置(优先级较低)
你在VerifyCsrfToken里设置$except = ['api/*']是正确的,但要确保你的路由确实是/api/klippekort(而非其他前缀)。不过因为当前是401错误,这一步不是核心问题。
内容的提问来源于stack exchange,提问作者UnknownFrequency

