Laravel 9中Auth::check失效:登录正常但登出提示未登录
问题分析与解决方法
问题核心在于:Laravel Passport的API认证是Token-based,而Auth::check()默认依赖Session认证机制,API请求中没有Session上下文,所以直接调用Auth::check()会返回false,导致进入未登录分支。
解决步骤
1. 确保登出路由使用auth:api中间件
在路由文件(如routes/api.php)中,登出路由必须通过Passport的API认证中间件保护:
Route::post('/logout', [AuthController::class, 'logout'])->middleware('auth:api');
这个中间件会自动解析请求头中的Token,完成用户认证,此时Auth::user()才能正确获取到当前用户。
2. 修改登出方法逻辑
不需要用Auth::check()判断,因为auth:api中间件已经确保只有认证用户才能访问该接口。直接通过Auth::user()获取用户,然后撤销其Token即可:
use Illuminate\Support\Facades\Auth; use Laravel\Passport\Token; public function logout(Request $request) { // 获取当前用户并撤销所有有效Token $user = Auth::user(); foreach ($user->tokens as $token) { $token->revoke(); } // 若只需撤销当前请求使用的Token,替换为以下代码: // $request->user()->token()->revoke(); return response()->json(['message' => 'Logged out successfully'], 200); }
额外说明
- 若登出接口未使用
auth:api中间件,请求不会携带Token认证信息,Auth门面自然无法识别用户。 - 原代码中直接更新所有用户Token为
revoked=true会导致该用户的所有设备都登出,按需选择撤销范围即可。
内容的提问来源于stack exchange,提问作者USMAN AHMED
相关产品推荐
相关产品推荐

