使用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路由组添加自定义中间件:
- 执行命令
php artisan make:middleware ForceJsonResponse创建中间件 - 打开
app/Http/Middleware/ForceJsonResponse.php,修改handle方法:
public function handle($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, // 放在组内最前面 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
- 第三步:验证效果
配置完成后,无论是浏览器直接访问API接口还是客户端未携带Token请求,都会直接返回401状态码的JSON错误信息,不会再尝试重定向到login路由。
内容的提问来源于stack exchange,提问作者Ratapof
相关产品推荐
相关产品推荐

