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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:05:21