如何解决Laravel 8 Sanctum出现的“401 Unauthorized”错误
Laravel 8 Sanctum 纯API Token认证401错误解决方案
以下是针对你场景的修复步骤,你是纯Token分发的API场景,不需要SPA状态校验逻辑,核心问题出在中间件配置冗余:
- 移除API中间件组的状态校验逻辑
打开app/Http/Kernel.php,找到$middlewareGroups下的api配置项,删除\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class这一行,修改后配置如下:
该中间件是为SPA同源请求设计的,会优先校验Cookie会话,无会话直接返回401,和你的纯Token认证场景冲突。'api' => [ 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], - 修正CORS配置冲突
你当前config/cors.php中allowed_origins设为*同时开启了supports_credentials,不符合浏览器跨域规则,纯API场景不需要携带跨域Cookie,直接将supports_credentials改为false即可。 - 校验Token生成逻辑
确认你给用户发放Token时调用的是Sanctum提供的原生方法,生成的是明文Token:
数据库// 正确示例,返回的$plainTextToken才是用户请求时需要携带的内容 $plainTextToken = $user->createToken('自定义令牌名称')->plainTextToken;personal_access_tokens表中存储的是哈希后的Token值,无法直接用于请求校验。 - 可选优化配置
纯API场景下可以直接清空.env中的SANCTUM_STATEFUL_DOMAINS配置,避免不必要的域校验逻辑。 - 服务端请求头丢失排查
如果修改后仍然返回401,可在routes/api.php中加一个临时无校验路由,打印请求头确认Authorization头是否被服务器过滤:
如果返回结果中没有Route::get('test-header', function (Request $request) { return response()->json($request->headers->all()); });authorization字段,说明你的Web服务器(Nginx/Apache)过滤了该头,以Nginx为例,需要在站点配置中添加:fastcgi_pass_header Authorization;
内容的提问来源于stack exchange,提问作者Vince Carter
相关产品推荐
相关产品推荐

