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
相关产品推荐
相关产品推荐

