You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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这一行,修改后配置如下:
    'api' => [
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
    
    该中间件是为SPA同源请求设计的,会优先校验Cookie会话,无会话直接返回401,和你的纯Token认证场景冲突。
  • 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:15:03