JWT 通用令牌生成

image-20200801152515482

官网:https://jwt.io/

1. 简介

JWT:Json Web Tokens 通用令牌生成算法。JSON Web令牌是一种开放的行业标准 RFC 7519方法,用于在双方之间安全地表示声明。重要、安全要求较高的信息交互,可以采用JWT算法。

  • Header - 头
    json格式
    头部信息:声明签名涉及的加密方式、令牌生成算法(JWT)
  • PayLoad - 有效荷载
    json格式
    内容信息:用户信息或者是令牌的信息
  • Sign - 签名
    签名信息:是根据头和内容对应的base64url格式,经过指定加密算法生成的密文

JWT的结果:

header的json字符串的Base64URL字符串.PayLoad的json字符串的Base64URL字符串.签名

image-20200801152404580

2. JWT 工具类

  • 依赖
1
2
3
4
5
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
  • 封装工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Date;
import java.util.UUID;

public class JwtUtil {

/**
* 以JWT算法生成密文
*
* @param msg 需要加密的字符串
*/
public static String createJWT(String msg) {
//实例化 建造器对象
JwtBuilder jwtBuilder = Jwts.builder();
//设置内容信息
jwtBuilder.setId(UUID.randomUUID().toString().replaceAll("-", ""));
jwtBuilder.setIssuedAt(new Date());
jwtBuilder.setSubject(msg);
//jwtBuilder.setExpiration() //设置结束时间
//设置加密的方式
jwtBuilder.signWith(SignatureAlgorithm.HS256, createKey());
//生成密文
return jwtBuilder.compact();
}

/**
* 解析JWT生成的密文
*/
public static String parseJWT(String msg) {
return Jwts.parser().setSigningKey(createKey()).parseClaimsJws(msg).getBody().getSubject();
}

/**
* 生成秘钥
*/
private static SecretKey createKey() {
String key = "jwt_test_1234";
return new SecretKeySpec(key.getBytes(), "AES");
}

// test
public static void main(String[] args) {
String p = "123456";
String jw = JwtUtil.createJWT(p);
System.out.println("token 密文:" + jw);
System.out.println("token 解析:" + JwtUtil.parseJWT(jw));
}
}

运行 main 测试:

image-20201107233634072


JWT 通用令牌生成
https://janycode.github.io/2020/03/02/08_框架技术/10_JWT/JWT 通用令牌生成/
作者
Jerry(姜源)
发布于
2020年3月2日
许可协议