使用Laravel Sanctum API展示已认证用户及处理未认证场景
解决Laravel Sanctum未认证时返回自定义响应的问题
问题根源
你的路由大概率应用了auth:sanctum中间件,未认证时Sanctum的中间件会直接抛出AuthenticationException并返回默认的"Unauthenticated."响应,根本不会进入控制器的me方法执行你写的else逻辑。
解决方案
方法一:全局自定义API未认证响应
修改异常处理器,让所有API路由的未认证请求返回自定义响应:
- 打开
app/Exceptions/Handler.php文件 - 在
register方法中添加以下代码:
use Illuminate\Auth\AuthenticationException; use Illuminate\Http\Request; public function register() { $this->renderable(function (AuthenticationException $e, Request $request) { // 仅对API路由生效 if ($request->is('api/*')) { return response()->json([ 'status' => 401, 'message' => 'No access' ], 401); } }); }
方法二:针对单个路由手动验证(无需中间件拦截)
移除路由的auth:sanctum中间件,在控制器内手动通过Sanctum Guard验证用户:
- 修改路由定义(去掉
auth:sanctum中间件):
// routes/api.php Route::get('/me', [UserController::class, 'me']);
- 更新控制器的
me方法,明确使用Sanctum Guard验证:
public function me(Request $request) { // 指定使用sanctum guard获取用户 $user = $request->user('sanctum'); if($user) { return response()->json([ 'status' => 200, 'user' => $user ]); } else { // 此处必须指定第二个参数为401,确保响应状态码正确 return response()->json([ 'status' => 401, 'message' => 'No access' ], 401); } }
注意事项
- 方法一适合统一修改所有API的未认证响应格式,方法二更灵活,仅针对单个或部分路由生效。
- 确保你的请求头中正确携带
Authorization: Bearer {token},避免因请求格式错误导致的认证失败。
内容的提问来源于stack exchange,提问作者John Mark
相关产品推荐
相关产品推荐

