Laravel 8 中自定义 Bearer Token 认证失败的错误响应

11次阅读

Laravel 8 中自定义 Bearer Token 认证失败的错误响应

laravel api 接口因缺失或无效 bearer Token 返回 401 错误时,可通过重写 `handler.php` 中的 `unauthenticated()` 方法,统一返回结构化 json 错误信息(如 `{“Error”: “unauthorized”}`),而非默认异常

laravel 8 中,Bearer Token 认证失败(例如 Token 缺失、格式错误、过期或无效)并不会触发 try-catch 块中的捕获——因为认证逻辑发生在请求进入控制器之前,由 auth:api 中间件路由层完成校验,并抛出 IlluminateAuthAuthenticationException。因此,你当前在控制器中调用 $request->bearerToken() 并包裹 try-catch 是无效的:该方法仅读取 Authorization 头中的 token 字符串,本身不会验证或抛异常(即使头不存在,也只返回 NULL)。

✅ 正确做法是全局拦截认证失败异常,在 app/Exceptions/Handler.php 中重写 unauthenticated() 方法:

// app/Exceptions/Handler.php use IlluminateAuthAuthenticationException; // ⚠️ 必须引入此命名空间  protected function unauthenticated($request, AuthenticationException $exception) {     // 判断是否为 API 请求(如 Postman、Axios 等)     if ($request->expectsJson()) {         return response()->json([             'success' => false,             'message' => 'Unauthorized: Invalid or missing Bearer token.',             'error_code' => 'TOKEN_INVALID'         ], 401);     }      // 非 API 请求(如网页跳转)可重定向至登录页     return redirect()->guest(route('login')); }

? 关键说明:

  • expectsjson() 自动识别 Accept: application/json 或 X-Requested-With: XMLHttpRequest 等常见 API 请求头;
  • 返回的 json 响应结构清晰、语义明确,便于前端统一处理;
  • 不要修改中间件或手动验证 token —— Laravel 的 token_guard 已内置完整流程(解析 → 查找用户 → 验证有效期 → 检查状态);
  • 若需自定义 token 验证逻辑(如多表、自定义加密),应扩展 TokenGuard 或使用 Sanctum/Passport,而非覆盖异常处理。

? 调试建议:
postman 中测试时,请确保请求头包含:

Authorization: Bearer abc123invalidtoken

或完全省略该头,即可触发 401 响应并看到你定义的 JSON 错误消息。

通过此方式,你将获得一致、专业、符合 REST 规范的认证错误体验,彻底解决“无提示 401”问题。

text=ZqhQzanResources