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

Laravel9使用php-open-source-saver/jwt-auth登出后旧token仍有效问题

Laravel 9集成jwt-auth登出后旧token仍可访问的修复方案

问题根因

JWT本身是无状态认证协议,默认签发的token只要签名正确、在有效期内就能通过校验。单纯调用Auth::logout()只会清掉当前请求生命周期里的认证用户上下文,不会主动作废已签发的token,必须配合包自带的黑名单机制才能实现token主动失效。

排查修复步骤

  • 打开JWT黑名单开关
    找到项目config/jwt.php文件,将blacklist_enabled配置项的值设为true。这个开关关着的话,所有登出、作废token的操作都不会生效,旧token只要没过期就能正常访问接口。
  • 更换为持久化缓存驱动
    JWT的作废token黑名单存在项目缓存里,如果.env里的CACHE_DRIVER设的是array(仅当前请求生效的临时缓存),请求结束后黑名单记录直接丢失,下次请求带旧token根本识别不出来已经作废。把缓存驱动改成file、redis、database这类持久化驱动就行。
  • 校验API守卫配置
    打开config/auth.php,找到guards.api配置段,确认driver值为jwt。如果留着Laravel默认的token驱动,auth:api中间件根本不会走JWT的黑名单校验逻辑,自然拦不住已登出的旧token。
  • 修正登出逻辑
    别只调用全局的Auth::logout(),显式指定api守卫执行登出、作废token操作,参考代码:
    public function logout()
    {
        // 把当前请求携带的token加入黑名单,实现作废
        auth('api')->logout();
        // 需要让该用户之前签发的所有token全部失效的话,加下面这行
        // auth('api')->invalidate(true);
    
        return response()->json(['message' => '登出成功']);
    }
    

验证方法

修复后先调登录接口拿token,再调登出接口,之后拿同一个token请求挂了auth:api中间件的接口,返回401未认证就是生效了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:30:52