测试 token 过期的两种方法

1. TokenManager 中添加 getTokenExpireTime() 方法

这种方法的好处是,既不会修改现有的 TokenManager 逻辑,也能为测试提供获取 token 过期时间的方法。

实现思路:

你可以在 TokenManager 中添加一个方法,来返回当前 token 的过期时间。这个方法应该会根据 token 的创建时间和过期时间(通常是 iatexp)来计算 token 是否过期。


签发时间(Issued At Time,通常缩写为 iat)是 JWT(JSON Web Token)中的一个标准声明(claim),用于表示这个 JWT 令牌是什么时候被创建(签发)的。它是一个时间戳,通常以 Unix 时间(即从 1970 年 1 月 1 日 00:00:00 UTC 到当前时间的秒数)表示。
测试代码示例:

在测试中,你可以使用 getTokenExpireTime() 方法来验证 token 是否在预期的时间内过期。

public class TokenManager {

    private static final long EXPIRATION_TIME = 3600 * 1000;  // 过期时间为 1 小时

    // 生成 JWT token
    public String generateToken(String username) {
        Date now = new Date();  // 获取当前时间
        Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME);  // 计算过期时间
        // 创建 JWT token 并设置过期时间
        return Jwts.builder()
                   .setSubject(username)  // 设置主题为用户名
                   .setIssuedAt(now)  // 设置签发时间
                   .setExpiration(expiryDate)  // 设置过期时间
                   .signWith(SignatureAlgorithm.HS512, "secret-key")  // 使用 HS512 算法和密钥签名
                   .compact();  // 生成 token
    }

    // 获取 token 过期时间
    public Date getTokenExpireTime(String token) {
        try {
            Claims claims = Jwts.parser()
                .setSigningKey("secret-key")  // 设置签名密钥
                .parseClaimsJws(token)  // 解析 token
                .getBody();  // 获取有效载荷
            return claims.getExpiration();  // 返回过期时间
        } catch (Exception e) {
            return null;  // 如果 token 无效或解析失败,返回 null
        }
    }
}

优点:
  1. 通过 getTokenExpireTime() 方法方便地获得 token 的过期时间,并且不需要修改 TokenManager 的核心逻辑。
  2. 测试变得更加灵活,可以针对过期时间进行精确验证。
缺点:
  • 这种方法需要依赖 getTokenExpireTime() 方法返回的时间,这可能会引入额外的复杂性,尤其是在不同的过期策略下(如 JWT)。

2. 修改 TokenManager 实现,支持较短的过期时间

如果你需要测试 token 是否过期,并且不想额外引入 getTokenExpireTime() 方法,你可以考虑修改 TokenManager 来支持较短的过期时间。

实现思路:

为了让 token 更快过期,你可以在 TokenManager 中通过设置较短的过期时间(例如,几秒钟)来加速过期过程。这样你可以直接在测试中验证 token 是否会在短时间内过期。

@Test
public void testTokenExpiration() {
    TokenManager tokenManager = new TokenManager();
    String token = tokenManager.generateToken("admin");

    Date expireTime = tokenManager.getTokenExpireTime(token);
    Date now = new Date();

    assertNotNull(expireTime);
    assertTrue(expireTime.after(now));  // 过期时间应该在当前时间之后
}
测试代码示例:
@Test
public void testTokenExpiration() {
    TokenManager tokenManager = new TokenManager();
    String token = tokenManager.generateToken("admin");

    Date expireTime = tokenManager.getTokenExpireTime(token);
    Date now = new Date();

    assertNotNull(expireTime);
    assertTrue(expireTime.after(now));  // 过期时间应该在当前时间之后
}
优点:
  1. 不需要额外的 getTokenExpireTime() 方法,直接通过设置较短的过期时间,快速验证过期的情况。
  2. 这种方法直接测试 token 的生命周期,避免了额外的计算和解析步骤。

缺点:

  1. 需要修改 TokenManager 中的过期时间设置,这可能会影响整个系统的配置和其他功能。
  2. 修改过期时间可能会使得其他功能或测试也受到影响,因此在测试后应恢复正常的过期时间。

总结

  1. 添加 getTokenExpireTime() 方法:这种方法不修改现有的 token 逻辑,通过读取 token 的过期时间来进行验证,适用于不想改变现有逻辑的情况。
  2. 修改 TokenManager 的实现:这种方法直接通过调整过期时间,测试 token 是否会在短时间内过期,适用于需要快速验证 token 过期的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值