JWT 使用示例
分类:软件编程
阅读:38
作者:皇太极
发布:2021-02-22 17:31:16

网上关于 JWT的介绍已经很多了,我们学习的时候可以参考下官网 https://jwt.io/introduction/

JWT组成
  • Header(头部)
  • Payload(负载)
  • Signature(签名)

生成的token串为: xxxxx.yyyyy.zzzzz (Header.Payload.Signature)

Header
  • alg (algorithm):签名的算法
  • typ (type):JWT 令牌统一写为JWT
    1. {
    2. "alg": "HS256",
    3. "typ": "JWT"
    4. }
Payload
  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号

除了上述的7个字段,我们可以添加自己的字段

  1. {
  2. "sub": "1234567890",
  3. "name": "John Doe",
  4. "admin": true
  5. }
Signature

部分是对前两部分的签名,防止数据篡改。

首先,需要指定一个密钥(secret)

  1. HMACSHA256(
  2. base64UrlEncode(header) + "." +
  3. base64UrlEncode(payload),
  4. secret)
JwtUtils
  1. public class JwtUtils {
  2. /**
  3. * 生成JWT字符串
  4. * @return JWT
  5. */
  6. public static String generateJWT(){
  7. //设置启动时间和过期时间
  8. long nowMillis = System.currentTimeMillis();
  9. long expMillis = nowMillis + 300000;
  10. Date now = new Date(nowMillis);
  11. Date expDate = new Date(expMillis);
  12. //JWT中存的信息
  13. Map<String,Object> map=new HashMap<>();
  14. map.put("username","marion");
  15. map.put("uid","123456789");
  16. JwtBuilder builder = Jwts.builder();
  17. builder.setId("1")
  18. .setSubject("jwt")
  19. .setIssuer("123456")
  20. .setIssuedAt(now)
  21. .signWith(SignatureAlgorithm.HS256,getKey())
  22. .setExpiration(expDate)
  23. .addClaims(map);
  24. //获取koken
  25. return builder.compact();
  26. }
  27. /**
  28. * 解析JWT字符串获取Claims容器
  29. * @param jwt JWT字符串
  30. * @return Claims容器
  31. * @throws Exception 解析异常
  32. */
  33. public static Claims parseJWT(String jwt) throws Exception {
  34. SecretKey secretKey = getParseKey();
  35. return Jwts.parser()
  36. .setSigningKey(secretKey)
  37. .parseClaimsJws(jwt)
  38. .getBody();
  39. }
  40. /**
  41. * 获取解析用密钥
  42. * @return 解析用密钥对象
  43. */
  44. public static SecretKey getParseKey(){
  45. byte[] encodedKey = "123456".getBytes();
  46. return new SecretKeySpec(encodedKey, 0, encodedKey.length, "");
  47. }
  48. /**
  49. * 获取加密用密钥
  50. * @return 加密用密钥对象
  51. */
  52. public static SecretKey getKey(){
  53. byte[] encodedKey = "123456".getBytes();
  54. return new SecretKeySpec(encodedKey, 0, encodedKey.length, "");
  55. }
  56. }
单元测试
  1. @Test
  2. public void jwtTest() throws Exception {
  3. String jwt = JwtUtils.generateJWT();
  4. System.out.println(jwt);
  5. System.out.println("-----");
  6. Claims claims = JwtUtils.parseJWT(jwt);
  7. System.out.println(claims.getSubject());
  8. System.out.println(claims.get("username")+"\t"+claims.get("uid"));
  9. }

控制台输出

  1. eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxIiwic3ViIjoiand0IiwiaXNzIjoiMTIzNDU2IiwiaWF0IjoxNjEzOTg2MTA3LCJleHAiOjE2MTM5ODY0MDcsInVpZCI6IjEyMzQ1Njc4OSIsInVzZXJuYW1lIjoibWFyaW9uIn0.aFijm2CqZsQWcL-Q2ydURNwxsPa_QKVs2vPCMFjnvIs
  2. -----
  3. jwt
  4. marion 123456789
使用官网验证工具验证

https://jwt.io/

image