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

使用Laravel Sanctum时如何正确返回API响应与401状态码

Laravel Sanctum API认证返回冗余HTML、未认证重定向问题修复方案

两个问题的核心诱因是路由未正确使用API中间件组、默认认证逻辑未对API请求做JSON响应适配,按以下步骤调整即可:

  • 路由位置校验
    所有API接口路由必须定义在routes/api.php文件中,禁止放在routes/web.php下。存放在api.php的路由会自动加载api中间件组,默认适配JSON响应逻辑,不会混入web页面渲染产生的冗余HTML代码。如果使用自定义路由文件,需要给对应路由组绑定api中间件组,不能仅单独挂载auth:sanctum中间件。
  • 修复未认证重定向逻辑
    打开app/Http/Middleware/Authenticate.php文件,调整redirectTo方法逻辑,当请求预期返回JSON时不返回登录路由,框架会自动返回401状态码的JSON响应,不再触发重定向:
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            return route('login');
        }
    }
    
  • 兜底配置:强制API路由返回JSON(可选)
    如果需要所有访问API前缀的请求无论是否携带Accept: application/json请求头都返回JSON格式,可以新增全局中间件做兜底:
    1. 执行命令生成中间件:
    php artisan make:middleware ForceJsonResponse
    
    1. 编辑生成的app/Http/Middleware/ForceJsonResponse.php文件,写入逻辑:
    <?php
    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Http\Request;
    
    class ForceJsonResponse
    {
        public function handle(Request $request, Closure $next)
        {
            $request->headers->set('Accept', 'application/json');
            return $next($request);
        }
    }
    
    1. 打开app/Http/Kernel.php,将中间件注册到api中间件组的最靠前位置:
    protected $middlewareGroups = [
        'api' => [
            \App\Http\Middleware\ForceJsonResponse::class,
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            // 其余原有中间件保持不变
        ],
    ];
    

配置完成后,携带有效Token访问测试路由将仅返回纯文本API OK,无多余HTML内容;携带无效Token时会直接返回401 Unauthorized状态码的JSON错误信息,不会跳转至登录页面。

内容的提问来源于stack exchange,提问作者user5482212

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:45:42