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

如何解决Laravel 10中Sanctum认证返回‘Unauthenticated’的问题

Laravel 10 Sanctum API认证失败排查方案

以下是针对你遇到的auth:sanctum中间件认证失败、无法获取用户信息问题的排查与解决步骤:

1. 核心配置与依赖检查

  • 用户模型必须引入Sanctum Trait
    确认你的User模型文件中已经引入并使用HasApiTokens trait:
    use Laravel\Sanctum\HasApiTokens;
    
    class User extends Authenticatable
    {
        use HasApiTokens, HasFactory, Notifiable;
        // ... 其他代码
    }
    
  • Token生成方式正确
    生成Token时必须使用createToken方法获取明文Token,数据库中存储的是哈希后的Token,无法直接用于请求:
    // 正确生成Token的示例
    $plainTextToken = $user->createToken('api-access-token')->plainTextToken;
    

2. 请求参数与格式验证

  • Bearer Token格式无误
    在Postman的Authorization选项卡选择Bearer Token类型,直接填入明文Token(无需手动添加Bearer 前缀,Postman会自动处理);如果手动设置请求头,必须严格遵循Bearer {token}格式(注意Bearer后有一个空格)。
  • 请求头配置完整
    确保请求头包含以下两项:
    • Content-Type: application/json
    • Accept: application/json

3. Sanctum配置文件检查

  • stateful域名配置
    打开config/sanctum.php,确认你的请求域名(本地测试为localhost或127.0.0.1)在stateful数组中:
    'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
        '%s%s',
        'localhost,127.0.0.1,::1',
        env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
    ))),
    
  • SESSION_DOMAIN设置
    在.env文件中,本地测试可设置SESSION_DOMAIN=localhost或留空;线上环境需设置为你的主域名(如yourdomain.com)。

4. 中间件与路由验证

  • API中间件组配置
    检查app/Http/Kernel.php的api中间件组是否包含Sanctum的状态检查中间件:
    'api' => [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
    
  • 路由中间件生效
    可以临时将中间件直接绑定到路由上,排除组配置的问题:
    Route::get('/user', [\App\Http\Controllers\Api\MenuController::class, 'listUserMenus'])
        ->middleware('auth:sanctum');
    

5. 调试与日志排查

  • 控制器临时调试
    修改控制器代码,打印请求头和认证状态,定位问题:
    public function listUserMenus()
    {
        // 调试:查看是否接收到Authorization头
        // dd(request()->header('Authorization'));
        
        if (!auth('sanctum')->check()) {
            return response(['error' => 'Unauthenticated'], 401);
        }
    
        $user = auth('sanctum')->user();
        // 注意:menus()是查询构造器,需调用get()获取实际数据
        $menus = $user->menus()->get();
    
        return response(['menus' => $menus], 200);
    }
    
  • 查看错误日志
    打开storage/logs/laravel.log,查找认证相关的错误信息,比如Token无效、用户不存在等具体提示。

内容的提问来源于stack exchange,提问作者Merve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:48:29