Java 生成 JWT Token 科普文章

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。JWT可以被验证和信任,因为它可以被数字签名。在本文中,我们将探讨如何在Java中生成JWT Token。

准备工作

在开始之前,我们需要添加一些依赖项到我们的项目中。我们将使用jjwt库来生成JWT Token。首先,在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

生成JWT Token

生成JWT Token的过程可以分为以下几个步骤:

  1. 定义JWT的头部:通常包含令牌的类型和使用的签名算法。
  2. 定义JWT的负载:包含一些声明,例如用户ID、用户名等。
  3. 定义JWT的签名:使用密钥和签名算法生成签名。

以下是生成JWT Token的示例代码:

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

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JWTTokenGenerator {
    public static void main(String[] args) {
        String secretKey = "your-secret-key";
        String issuer = "your-issuer";
        String subject = "your-subject";
        String audience = "your-audience";
        Date expiration = new Date(System.currentTimeMillis() + 3600000); // 1 hour later

        Map<String, Object> claims = new HashMap<>();
        claims.put("user_id", "123456");
        claims.put("username", "example_user");

        String token = Jwts.builder()
                .setClaims(claims)
                .setIssuer(issuer)
                .setSubject(subject)
                .setAudience(audience)
                .setIssuedAt(new Date())
                .setExpiration(expiration)
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .compact();

        System.out.println("JWT Token: " + token);
    }
}

解析JWT Token

解析JWT Token的过程包括验证签名和提取负载中的声明。以下是解析JWT Token的示例代码:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jws;

import java.util.Map;

public class JWTTokenParser {
    public static void main(String[] args) {
        String secretKey = "your-secret-key";
        String token = "your-jwt-token";

        JwtParser jwtParser = Jwts.parser().setSigningKey(secretKey);
        Jws<Claims> claimsJws = jwtParser.parseClaimsJws(token);

        Claims claims = claimsJws.getBody();
        System.out.println("Issuer: " + claims.getIssuer());
        System.out.println("Subject: " + claims.getSubject());
        System.out.println("Audience: " + claims.getAudience());
        System.out.println("Expiration: " + claims.getExpiration());
        System.out.println("User ID: " + claims.get("user_id"));
        System.out.println("Username: " + claims.get("username"));
    }
}

关系图

以下是JWT Token生成和解析过程中涉及的实体关系图:

erDiagram
    CLAIMS ||--o JWT
    JWT {
        int id
        string type
        string algorithm
        string issuer
        string subject
        string audience
        date issuedAt
        date expiration
    }
    CLAIMS {
        string key
        string value
    }

甘特图

以下是生成和解析JWT Token的过程的甘特图:

gantt
    title JWT Token Process
    dateFormat  YYYY-MM-DD
    section Generate JWT Token
    Define JWT Header :done, des1, 2022-01-01,2022-01-02
    Define JWT Payload :done, des2, after des1, 2022-01-03
    Define JWT Signature :done, des3, after des2, 2022-01-04
    section Parse JWT Token
    Verify JWT Signature :active, des4, 2022-01-05, 2022-01-06
    Extract JWT Claims :after des4, 2022-01-07

结语

通过本文,我们了解了如何在Java中生成和解析JWT Token。JWT Token是一种安全且易于使用的方法,用于在各方之间传输信息。希望本文对您有所帮助。