
当 laravel api 接口因缺失或无效 bearer token 返回 401 错误时,可通过重写 `handler.php` 中的 `unauthenticated()` 方法,统一返回结构化 json 错误信息(如 `{"error": "unauthorized"}`),而非默认异常堆栈。
在 Laravel 8 中,Bearer Token 认证失败(例如 Token 缺失、格式错误、过期或无效)并不会触发 try-catch 块中的捕获——因为认证逻辑发生在请求进入控制器之前,由 auth:api 中间件在路由层完成校验,并抛出 Illuminate\Auth\AuthenticationException。因此,你当前在控制器中调用 $request->bearerToken() 并包裹 try-catch 是无效的:该方法仅读取 Authorization 头中的 token 字符串,本身不会验证或抛异常(即使头不存在,也只返回 null)。
✅ 正确做法是全局拦截认证失败异常,在 app/Exceptions/Handler.php 中重写 unauthenticated() 方法:
// app/Exceptions/Handler.php
use Illuminate\Auth\AuthenticationException; // ⚠️ 必须引入此命名空间
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”问题。










