一、JWT令牌介绍
JWT(JSON Web Tokens)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象的形式安全地传输信息。每个JWT令牌由三部分组成:Header(头部)、Payload(负载)和Signature(签名),它们之间用点(.)分隔。
1.Header(头部):通常包含两部分:令牌的类型(即JWT)和所使用的签名算法,如HMAC SHA256或RSA。
2.Payload(负载):包含所要传递的信息。负载可以包含多个声明(Claims),它们是关于实体(通常是用户)和其他数据的陈述。声明有三种类型:
- Registered Claims:预定义的声明,有特定的语义,如exp(过期时间)、iss(发行人)、sub(主题)、aud(受众)等。
- Public Claims:公共的声明,可以由使用JWT的各方自定义,如name或admin。
- Private Claims:私有声明,是为在各方之间共享信息而创建的自定义声明。
3.Signature(签名):用于验证消息在传输过程中未被篡改,并且,对于使用私钥签名的令牌,还可以验证发送者的身份。签名的生成过程通常涉及使用头部指定的算法和密钥。
JWT的创建和验证过程通常如下:
- 创建:首先,将头部和负载编码为Base64Url格式,然后将它们用点连接起来。接着,使用密钥和头部中指定的算法对这个连接后的字符串进行签名,最后将签名附加到字符串的末尾。
- 验证:接收方接收到JWT后,首先对签名进行验证,确保令牌未被篡改,并且签名与使用的密钥匹配。如果验证通过,接收方可以读取负载中的声明。
JWT广泛应用于身份验证和信息交换,特别是在分布式系统和服务之间。它们可以用于单点登录(SSO)、用户会话管理和跨域身份验证等场景。由于JWT是自包含的,因此不需要查询数据库来验证令牌的有效性,这使得它们在网络应用中非常高效。然而,由于JWT可以包含敏感信息,因此通常需要通过HTTPS传输以确保安全性。
二、操作环境
win10、IDEA、JDK 17、MAVEN 3.6.0、Spring Boot 3.x(全程联网)
三、获取令牌
1.引入依赖到pom.xml
<!--JWT令牌依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.12.3</version>
</dependency>
2.编写测试代码
/**
* 生成JWT令牌
*/
@Test
public void getJwt(){
Map<String,Object> claims = new HashMap<>();
claims.put("id",1);
claims.put("username","KBL");
String jwt = Jwts.builder()
.setClaims(claims) //自定义内容(载荷)
.signWith(SignatureAlgorithm.HS256, "chengxuyuanchengxuyuanchengxuyuanchengxuyuanchengxuyuan") //签名算法
.setExpiration(new Date(System.currentTimeMillis() + 24*3600*1000)) //有效期
.compact();
System.out.println(jwt);
}
注意事项:
3.运行获取JWT令牌,若是获取失败,请参考(解决无法生成JWT令牌)
四、解析令牌
方式一:本地解析
1.编写解析代码
/**
* 解析JWT令牌
*/
@Test
public void parseJwt(){
Claims claims = Jwts.parser()
.setSigningKey("chengxuyuanchengxuyuanchengxuyuanchengxuyuanchengxuyuan")//指定签名密钥(必须保证和生成令牌时使用相同的签名密钥)
.build()
.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJLQkwiLCJleHAiOjE3Mjc3NzkxNTR9.7Nt1IbfAZ52PKW5cjjbjr3oND9iaJxvGFO5w5g3uNV8")
.getBody();
System.out.println(claims);
}
注意事项:要和第三步获取令牌的信息对应起来,以免报错
2.运行测试代码解析JWT令牌
方式二:官网解析
1.进入官网:JSON Web Tokens - jwt.io
2.选择加密算法:
3.左栏输入获取的JWT令牌,右栏可以看到解析的结果(可以看到结果和方式一一致)
以上就是关于如何获取和解析JWT令牌的方式,感谢各位看官的观看,下期见,谢谢~