如何解决Laravel 10中Sanctum认证返回‘Unauthenticated’的问题
Laravel 10 Sanctum API认证失败排查方案
以下是针对你遇到的auth:sanctum中间件认证失败、无法获取用户信息问题的排查与解决步骤:
1. 核心配置与依赖检查
- 用户模型必须引入Sanctum Trait
确认你的User模型文件中已经引入并使用HasApiTokenstrait: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/jsonAccept: 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
相关产品推荐
相关产品推荐

