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

使用Laravel Sanctum API展示已认证用户及处理未认证场景

解决Laravel Sanctum未认证时返回自定义响应的问题

问题根源

你的路由大概率应用了auth:sanctum中间件,未认证时Sanctum的中间件会直接抛出AuthenticationException并返回默认的"Unauthenticated."响应,根本不会进入控制器的me方法执行你写的else逻辑。

解决方案

方法一:全局自定义API未认证响应

修改异常处理器,让所有API路由的未认证请求返回自定义响应:

  1. 打开app/Exceptions/Handler.php文件
  2. 在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验证用户:

  1. 修改路由定义(去掉auth:sanctum中间件):
// routes/api.php
Route::get('/me', [UserController::class, 'me']);
  1. 更新控制器的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:15:35