JWT
JSON Web Token
jwt的格式可分为3部分
1、Header中一般包括两部分信息
{
"alg": "RS256",
"typ": "JWT"
}
- alg:声明加密的算法
- typ:声明类型
2、playload(负载)
不在playload中放敏感数据信息
- 标准声明
- 公共声明
- 私有声明
标准声明包括:(不强制)
iss?: string; // JWT的签发者
sub?: string; // JWT所面向的用户
aud?: string; // 接收JWT的一方
exp?: number; // JWT的过期时间
nbf?: number; // 在xxx日期之间,该JWT都是可用的
iat?: number; // 该JWT签发的时间
jti?: number; //JWT的唯一身份标识
3、signature(签证)
加密算法(header (base64加密后)+payload (base64加密后)+secret(加盐))
生成jwt = 三部分用.
拼接后的完整字符串
jwt的功能流程
jwt相应的优势
- 简洁:Header、playload、signature三部分生成,数据量小
- playload上包含用户信息,避免多次查询数据库
接下来看一个简单生成jwt token的例子
首先在maven引入相应jar包
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.3</version>
</dependency>
然后直接在在测试类中生成token
@Test
void contextLoads() {
HashMap<String,Object> map = new HashMap<>();
Calendar instance = Calendar.getInstance();
instance.add(Calendar.SECOND,20);
String tooken = JWT.create().withHeader(map)
.withClaim("username","xiaoming")
.withClaim("userId",12)//注意这儿存的时候是int类型
.withExpiresAt(instance.getTime())
.sign(Algorithm.HMAC256("!@wqer@#%ERT"));
System.out.println(tooken);//eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTM1NzEzMTEsInVzZXJJZCI6MjEsInVzZXJuYW1lIjoieGlhb21pbmcifQ.dtvLyuACByalZlk6Mr7lXtuxBRbTOs5ToLnQHTJIClM
}
然后我们再写一个测试类去解析生成的token
@Test
public void test(){
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("!@wqer@#%ERT")).build();
DecodedJWT verify = jwtVerifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTM1NzIxODcsInVzZXJJZCI6MjEsInVzZXJuYW1lIjoieGlhb21pbmcifQ.2BQ3RbUTAQfPOaKTaNS_Sfjsv1JJmmDL2Ci9SQ3r2XA");
System.out.println(verify.getClaim("userId").asString());
System.out.println(verify.getClaim("username").asString());
}
在生成token的时候,在负载中存入的是
.withClaim("userId",12)
当执行去解析的时候使用asString()
,发现结果为null
可以发现userId对应的值为int类型(12)
.getClaim("userId").asString() // null
尝试使用asInt
,成功解析