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

使用Laravel与Laravel Passport创建API时未携带token报login路由不存在问题

解决方案

问题根源

Laravel 默认的未认证异常逻辑会判断请求是否期望返回JSON,如果是普通浏览器访问(Accept头为text/html),会自动重定向到名为login的路由,而API场景下一般不会定义这个路由,因此触发RouteNotFoundException。

实现步骤

  • 第一步:修改异常处理类
    打开app/Exceptions/Handler.php,重写unauthenticated方法,代码如下:
protected function unauthenticated($request, \Illuminate\Auth\AuthenticationException $exception)
{
    // 所有api前缀的请求直接返回JSON错误
    if ($request->is('api/*')) {
        return response()->json([
            'code' => 401,
            'message' => '未提供有效身份凭证,请携带正确的Bearer Token访问'
        ], 401);
    }

    // 非API请求保留原有逻辑,可根据需要调整
    return redirect()->guest(route('login'));
}
  • 第二步:可选优化,强制API路由返回JSON响应
    如果要让所有API接口无论请求头如何都优先返回JSON,可以给API路由组添加自定义中间件:
  1. 执行命令php artisan make:middleware ForceJsonResponse创建中间件
  2. 打开app/Http/Middleware/ForceJsonResponse.php,修改handle方法:
public function handle($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, // 放在组内最前面
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];
  • 第三步:验证效果
    配置完成后,无论是浏览器直接访问API接口还是客户端未携带Token请求,都会直接返回401状态码的JSON错误信息,不会再尝试重定向到login路由。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:21:03