Laravel 11 API使用Sanctum授权时登出返回401未认证问题解决
Laravel 11 Sanctum 登出返回401问题排查方案
1. 确认登出路由的认证中间件
确保登出路由明确使用auth:sanctum中间件,而非其他守卫或未配置中间件:
// routes/api.php use App\Http\Controllers\AuthController; use Illuminate\Support\Facades\Route; Route::post('/login', [AuthController::class, 'login']); // 必须添加auth:sanctum中间件 Route::post('/logout', [AuthController::class, 'logout'])->middleware('auth:sanctum');
2. 检查Logout方法的正确实现
Sanctum基于Token认证,不能使用auth()->logout()(这是Session认证的登出方式),需针对Token操作:
// App/Http/Controllers/AuthController.php use Illuminate\Http\Request; public function logout(Request $request) { // 删除当前请求使用的Token(推荐) $request->user()->currentAccessToken()->delete(); // 或者删除该用户所有Token(适用于需强制下线所有设备的场景) // $request->user()->tokens()->delete(); return response()->json(['message' => '登出成功'], 200); }
3. 验证Postman请求的Token传递
- 确保请求头包含
Authorization: Bearer {your-token},其中{your-token}是登录接口返回的完整Token,注意Bearer后需加空格 - 检查Token是否过期:可查看数据库
personal_access_tokens表的expires_at字段,或在登录时确认Token有效期配置
4. 确认Sanctum守卫配置
检查config/auth.php中sanctum守卫的provider是否与用户模型匹配:
// config/auth.php 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'sanctum' => [ 'driver' => 'sanctum', 'provider' => 'users', // 需与你的用户provider一致 ], ],
5. 排查Token存储与状态
- 登录成功后,查看
personal_access_tokens表是否生成对应记录 - 若执行登出后仍401,可先手动删除该表中对应Token,再重新登录测试
内容的提问来源于stack exchange,提问作者user27365176
相关产品推荐
相关产品推荐

