Java JWT 设置 Token 过期

在现代的 Web 应用程序中,身份验证是一个重要的部分。JSON Web Token (JWT) 是一种用于身份验证的开放标准,它提供了一种简单而安全的方式来传输信息,特别是在分布式系统中。JWT 由三个部分组成:头部、载荷和签名。

JWT 的头部是一个包含类型和算法的 JSON 对象,例如:

{
  "alg": "HS256",
  "typ": "JWT"
}

载荷是存储实际数据的部分,例如用户的 ID 和角色:

{
  "sub": "1234567890",
  "role": "admin"
}

签名使用头部和载荷以及一个密钥生成,以确保数据的完整性和安全性。

然而,JWT 的一个重要问题是如何处理 Token 的过期。在实际应用中,我们不希望用户持有一个过期的 Token 仍然可以访问系统资源。为了解决这个问题,我们可以在 Token 的载荷中添加一个过期时间(exp),并在服务器端验证 Token 是否过期。

下面是一个使用 Java 实现 JWT 设置 Token 过期的示例代码:

  1. 首先,我们需要引入一个 Java JWT 库,例如 jjwt:
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
  1. 接下来,我们可以使用以下代码生成一个带有过期时间的 Token:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JwtUtils {

    private static final String SECRET_KEY = "your-secret-key";
    private static final long EXPIRATION_TIME = 86400000; // 24 hours

    public static String generateToken(String userId) {
        Date expirationDate = new Date(System.currentTimeMillis() + EXPIRATION_TIME);

        return Jwts.builder()
                .setSubject(userId)
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }

    public static boolean validateToken(String token) {
        try {
            Jws<Claims> claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            Date expirationDate = claims.getBody().getExpiration();
            return !expirationDate.before(new Date());
        } catch (Exception e) {
            return false;
        }
    }
}

在上述代码中,generateToken 方法用于生成 Token,其中 EXPIRATION_TIME 定义了过期时间,默认为 24 小时。validateToken 方法用于验证 Token 是否过期。

  1. 最后,我们可以在需要验证 Token 的地方调用 validateToken 方法进行验证:
import javax.servlet.http.HttpServletRequest;

public class AuthUtils {

    public static boolean isAuthenticated(HttpServletRequest request) {
        String token = request.getHeader("Authorization");

        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            return JwtUtils.validateToken(token);
        }

        return false;
    }
}

在上述代码中,我们通过 Authorization 头部获取 Token,并调用 JwtUtils.validateToken 方法进行验证。

通过以上的代码示例,我们可以实现在 Java 中设置 Token 的过期时间,并验证 Token 是否有效。

journey
    title Java JWT 设置 Token 过期

    section 生成 Token
      JwtUtils.generateToken("1234567890")
    end

    section 验证 Token
      AuthUtils.isAuthenticated(request)
    end
erDiagram
    User ||--o{ Token : has

总结: 在 Web 应用程序中,设置 Token 的过期时间是非常重要的。通过添加过期时间信息到 JWT 的载荷中,并在服务器端验证 Token 是否过期,我们可以确保用户持有一个过期的 Token 无法访问系统资源。Java 中的 jjwt 库提供了方便的方法来处理 JWT,使我们能够轻松地设置 Token 的过期时间并进行验证。