实现 Java JWT Token 失效的完整指南

在现代 web 应用中,使用 JSON Web Tokens (JWT) 来进行用户身份验证已经越来越普遍。不过,有时候我们需要使这些 token 失效,以保护用户数据。在本文中,我们将详细介绍如何实现 JWT Token 的失效功能。

整体流程概览

下面是实现 JWT Token 失效的基本步骤:

步骤 描述
1 生成 JWT Token
2 将 Token 存储在数据库或内存中(例如 Redis)
3 实现 Token 失效的方法
4 在每次请求时验证 Token 的有效性
5 清理过期的 Token

步骤详解

步骤 1:生成 JWT Token

我们需要首先生成 JWT token。以下是一个生成 JWT token 的示例代码:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public String generateToken(String username) {
    // 设置过期时间为 1小时
    long expirationTime = 3600000;
    
    // 创建 Token
    String token = Jwts.builder()
            .setSubject(username)  // 设置主体
            .setExpiration(new Date(System.currentTimeMillis() + expirationTime))  // 设置过期时间
            .signWith(SignatureAlgorithm.HS512, "secretKey")  // 使用密钥进行签名
            .compact();
    
    return token;  // 返回生成的 token
}

步骤 2:将 Token 存储在数据库或内存中(如 Redis)

为了能使 token 失效,我们需要保存这些 token 并能够在将来检索它们。以下是如何使用 Redis 来存储 token 的示例:

import redis.clients.jedis.Jedis;

public void storeToken(String token) {
    try (Jedis jedis = new Jedis("localhost")) {
        // 存储 token,设置过期时间为 1小时
        jedis.setex(token, 3600, "active");
    }
}

步骤 3:实现 Token 失效的方法

当用户登出或需要使 token 失效时,我们可以将其从存储中删除。以下是实现 token 失效的方法:

public void invalidateToken(String token) {
    try (Jedis jedis = new Jedis("localhost")) {
        // 删除 token
        jedis.del(token);
    }
}

步骤 4:在每次请求时验证 Token 的有效性

在每次 API 请求中,我们需要验证 token 的有效性。以下是一个简单的验证方法:

public boolean validateToken(String token) {
    try (Jedis jedis = new Jedis("localhost")) {
        // 检查 token 是否存在于 Redis
        String status = jedis.get(token);
        return status != null;  // 如果返回非空,表示 token 是有效的
    }
}

步骤 5:清理过期的 Token

为了保持 Redis 的健康,我们需要定期清理已过期的 token。可以利用 Redis 的 TTL 功能,自动实现过期清理。

示例甘特图

下面是实施这一系统的甘特图,帮助你更熟悉时间安排:

gantt
    title JWT Token 失效实现计划
    dateFormat  YYYY-MM-DD
    section 开发阶段
    生成 JWT Token               :a1, 2023-10-01, 5d
    存储 Token                  :after a1  , 3d
    实现 Token 失效方法           : 3d 
    验证 Token                  : 2d
    清理过期 Token              : 2d

ER 图

为了更好地理解数据结构,下面是一个简化的 ER 图,显示我们存储 token 的基本关系:

erDiagram
    USERS {
        Long id PK
        String username
        String password
    }
    TOKENS {
        String token PK
        Long userId FK
        Date expirationDate
    }
    USERS ||--o{ TOKENS : generates

结尾

通过以上步骤,我们已经实现了 token 的生成、存储、验证与失效的方法。简单来说,当用户需要登出,或者我们检测到 token 需要失效时,我们只需调用 invalidateToken 方法就可以了。

掌握这些基础知识后,你可以在任何需要身份认证的应用中实现 JWT Token 失效功能。希望这篇文章能够帮助你更好地理解和实现 JWT Token 的失效机制。如果你有任何问题,随时可以问我!