使用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格式,可以新增全局中间件做兜底:- 执行命令生成中间件:
php artisan make:middleware ForceJsonResponse- 编辑生成的
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); } }- 打开
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
相关产品推荐
相关产品推荐

