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

如何在Laravel应用中批量失效未存库的JWT令牌?

批量失效Laravel JWT令牌解决方案

你遇到的问题核心在于:JWT是无状态令牌,只要签名密钥不变且令牌未过期,就会持续有效。你之前执行的命令未生效,大概率是配置缓存或PHP字节码缓存未清理干净,或是用了不匹配版本的密钥生成命令。

以下是两种可行的解决路径:

一、快速失效方案(依赖密钥变更)

如果你的JWT依赖是tymon/jwt-auth,注意不同版本的密钥生成命令差异:

  • 旧版本(<=1.0):执行 php artisan jwt:generate
  • 新版本(>=2.0):执行 php artisan jwt:secret

生成新密钥后,必须执行以下命令确保配置完全生效:

php artisan config:clear
php artisan config:cache
php artisan route:clear

关键提醒:如果服务器开启了OPcache或其他PHP字节码缓存,务必重启PHP-FPM(或Apache/Nginx)——OPcache会缓存旧的配置内容,导致新密钥无法被加载。

二、持久化可控方案(适合频繁批量失效场景)

若后续可能需要多次批量失效令牌,或不想频繁变更JWT密钥,推荐给用户表添加版本控制字段:

  1. 给users表添加jwt_version字段(默认值设为1):
php artisan make:migration add_jwt_version_to_users_table --table=users

在生成的迁移文件中写入:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->integer('jwt_version')->default(1);
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('jwt_version');
    });
}

执行迁移:php artisan migrate

  1. 修改令牌签发逻辑,将jwt_version加入JWT payload:
    在登录请求的控制器中,签发令牌时添加版本声明:
$user = auth()->user();
$token = auth()->claims(['jwt_version' => $user->jwt_version])->attempt($credentials);
  1. 添加令牌验证逻辑,检查版本匹配:
    在app/Providers/AuthServiceProvider.php的boot方法中,注册JWT解析器:
use Tymon\JWTAuth\Facades\JWTAuth;
use Tymon\JWTAuth\Exceptions\TokenInvalidException;

public function boot()
{
    $this->registerPolicies();

    JWTAuth::parser(function ($token) {
        $payload = $token->getPayload();
        $user = \App\Models\User::find($payload['sub']);
        
        if ($user && $user->jwt_version !== $payload['jwt_version']) {
            throw new TokenInvalidException('令牌已失效,请重新登录');
        }
        
        return $token;
    });
}
  1. 批量失效所有令牌时,只需执行:
php artisan tinker

在tinker中运行:

\App\Models\User::query()->increment('jwt_version');

该方案无需变更JWT密钥,通过用户表的版本字段控制令牌有效性,更灵活可控。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:35:20