当前位置:   article > 正文

【JAVA】JWT令牌生成和解析(库:jjwt 版本:0.12.3)_java jwt 生成 与解析

java jwt 生成 与解析

介绍

组成:

  • 第一部分:Header(头), 记录令牌类型、签名算法等。 例如:{"alg":"HS256","type":"JWT"}
  • 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}
  • 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。

 JWT官方:JSON Web Tokens - jwt.io

本篇文章讲解的是下图中的库。GitHub地址:https://github.com/jwtk/jjwt 

一、第一步导入依赖:

  1. <dependency>
  2. <groupId>io.jsonwebtoken</groupId>
  3. <artifactId>jjwt-api</artifactId>
  4. <version>0.12.3</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>io.jsonwebtoken</groupId>
  8. <artifactId>jjwt-impl</artifactId>
  9. <version>0.12.3</version>
  10. <scope>runtime</scope>
  11. </dependency>
  12. <dependency>
  13. <groupId>io.jsonwebtoken</groupId>
  14. <artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
  15. <version>0.12.3</version>
  16. <scope>runtime</scope>
  17. </dependency>
  18. <!-- Uncomment this next dependency if you are using:
  19. - JDK 10 or earlier, and you want to use RSASSA-PSS (PS256, PS384, PS512) signature algorithms.
  20. - JDK 10 or earlier, and you want to use EdECDH (X25519 or X448) Elliptic Curve Diffie-Hellman encryption.
  21. - JDK 14 or earlier, and you want to use EdDSA (Ed25519 or Ed448) Elliptic Curve signature algorithms.
  22. It is unnecessary for these algorithms on JDK 15 or later.
  23. <dependency>
  24. <groupId>org.bouncycastle</groupId>
  25. <artifactId>bcprov-jdk18on</artifactId> or bcprov-jdk15to18 on JDK 7
  26. <version>1.76</version>
  27. <scope>runtime</scope>
  28. </dependency>
  29. -->

二、生成JWT令牌

下面的代码介绍了两种密钥设置的方法。方法一自定义密钥(需满足长度>=256 bits);方法二:使用HMAC-SHA 算法生成密钥。

使用字符串当密钥的官方文档:https://github.com/jwtk/jjwt?tab=readme-ov-file#secretkey-formats

算法生成密钥的官方文档:https://github.com/jwtk/jjwt?tab=readme-ov-file#creating-safe-keys

  1. /**
  2. * 生成JWT
  3. */
  4. @Test
  5. public void testGenJwt2(){
  6. //设置令牌中携带的内容
  7. Map<String, Object> claims = new HashMap<>();
  8. claims.put("id", 1);
  9. claims.put("name", "tom");
  10. //生成密钥
  11. //方法一:自定义密钥(注:自定义必须满足base64编码后字节长度>=256 bits)
  12. //需要先对字符串进行BASE64编码才可以设置密钥,自定义密钥需要有足够的长度
  13. //SecretKey key = Keys.hmacShaKeyFor(Decoders.BASE64.decode("12345612qwwwwwwwwwwwwwwwwwwwwwwwwwwwww33333333333333333333333"));
  14. //方法二:生成密钥
  15. SecretKey key = Jwts.SIG.HS256.key().build();
  16. //生成JWT令牌
  17. String jwt = Jwts.builder()
  18. .claims(claims) //自定义内容(载荷)
  19. .expiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置有效期为1h
  20. .signWith(key, Jwts.SIG.HS256) //算法签名,(密钥,加密算法)
  21. .compact(); //返回为字符串类型的jwt令牌
  22. System.out.println(jwt);
  23. }

三、解析JWT令牌:

官网文档参考地址:https://github.com/jwtk/jjwt?tab=readme-ov-file#reading-a-jwt

  1. /**
  2. * 解析JWT
  3. */
  4. @Test
  5. public void testParseJwt2(){
  6. //将jwt令牌放到CharSequence类型中
  7. CharSequence jws = "eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6NDEzMjI2NzkzMX0.knAZ5DiA-D4xvVGxk2NISfi3D59XR2Wmy_MAPCr1zzE";
  8. //设置解析令牌的密钥
  9. SecretKey secretKey = Keys.hmacShaKeyFor(Decoders.BASE64.decode("12345612qwwwwwwwwwwwwwwwwwwwwwwwwwwwww33333333333333333333333"));
  10. //解析jwt令牌,获取- Payload(有效载荷)
  11. Claims claims =Jwts.parser()
  12. .verifyWith(secretKey) // 传递密钥
  13. .build()
  14. .parseSignedClaims(jws) //传递jwt令牌参数
  15. .getPayload(); // 获取- Payload(有效载荷)
  16. System.out.println(claims);//打印内容:{name=tom, id=1, exp=4132267931}
  17. }

PS:不理解的,可以看一看它的源码中相关方法的注释,再结合官方文档,就很容易理解了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/544462
推荐阅读
相关标签
  

闽ICP备14008679号