登录校验JWT令牌

发布于:2024-10-17 ⋅ 阅读:(14) ⋅ 点赞:(0)

JWT(JSON Web Tokens)官网:JSON Web Tokens - jwt.io

一种开放标准(RFC 7519),它定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。

由于数字签名的存在,这些信息是可靠的。

每个JWT令牌由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

JWT可以被用来在用户和服务器之间安全地传递信息,常用于身份验证和信息交换。

JWT通常包含以下信息:

  • 头部(Header):通常包含令牌的类型(即JWT)和所使用的签名算法,比如HS256或RS256。
  • 载荷(Payload):包含所要传递的信息。对于登录场景,可能包含用户ID、用户名、角色、令牌的过期时间等。
  • 签名(Signature):使用头部和载荷的信息,加上一个密钥,通过指定的算法生成签名。这个签名用于验证JWT的完整性和验证发送者的身份。

JWT应用

引入依赖

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

刨析创建Jwt过程,解释代码如下

@Test
    public void testCreateJwt() {
        // 定义信息的载荷
        Map<String, Object> claims = new HashMap<>();

        claims.put("id", 15);
        claims.put("username", "angindem");
        claims.put("password", "123456");


        String jwt = Jwts.builder()  // 通过调用 Jwts 的内置工具类 的 builder 进行 jwt 令牌的创建
                .signWith(SignatureAlgorithm.HS256, "angindem")    // 注册头部信息   Jwt 令牌 的数字签名, 其中第一个参数是 jwt 的签名算法,第二个参数是自定义的数字签名
                .setClaims(claims)        // 存储需传递的信息载荷
                .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))      // 定义 令牌的有效期 为 1h 这里 是 ms单位
                .compact();// 生成 String 的 jwt 令牌

        System.out.println(jwt);
    }

最后获取打印的令牌:

eyJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsImlkIjoxNSwiZXhwIjoxNzI4OTg4OTU0LCJ1c2VybmFtZSI6ImFuZ2luZGVtIn0.330s6ykeitx58fC9n-5pPKAhH3555Ge-DUvNRCR-fe0

通过官网解析可以得到相应的对象信息

刨析  解析Jwt令牌过程,解释代码如下

 @Test
    public void testParseJwt(){

        String jwt = "eyJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsImlkIjoxNSwiZXhwIjoxNzI4OTg4OTU0LCJ1c2VybmFtZSI6ImFuZ2luZGVtIn0.330s6ykeitx58fC9n-5pPKAhH3555Ge-DUvNRCR-fe0";

        Claims claims = Jwts.parser()
                .setSigningKey("angindem")    // 设置我们注册对应Jwt的解析密钥
                .parseClaimsJws(jwt)    // 解析 jwt 令牌
                .getBody();     // 获取解析后的实体

        System.out.println(claims);
    }

最后解析结果:

Jwt令牌工具类


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

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

public class JwtUtils {

    private static String signKey = "Angindem";      // 令牌数字签名
    private static Long expire =  43200000L;        // 令牌有效期 12 小时

    // 创建Jwt令牌
    public static String getJwt(Map<String,Object> claims){
        String jwt = Jwts.builder()
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .compact();
        return jwt;
    }

    // 解析 Jwt 令牌
    public static Claims parseJwt(String jwt){
        Claims claims = Jwts.parser()
                .setSigningKey(signKey)
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }
}