JWT认证
JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
由三部分组成:
1,头部(header): token类型和签名算法, json
2,数据(payload): 存放实际需要传递的数据,json
3,签名(Signature):base64编码过的header数据+"."+base64编码过的payload数据,服务端密钥,从头部获取签名算法,进行加密获得。
整个字符串的组成方式:base64编码过的header数据+"."+base64编码过的payload数据+"."+Signature
JWT优势
- 简洁(Compact):可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快
- 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库
- 因为Token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持。
- 不需要在服务端保存会话信息,特别适用于分布式微服务。
环境
1,JDK17
2,spring boot 3.0.0-M4
代码编写
1,pom引入
<!-- JWT 相关 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jjwt.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>${jjwt.version}</version>
<scope>runtime</scope>
</dependency>
2,配置
auth:
jwt:
# 加密密钥 ,HMAC-SHA algorithms MUST have a size >= 256 bits, 必须>=32个字符
secret: ewrfwafdasfsdafasdfasdfasserefsdfs
# 过期时间(秒)
expiration: 604800
3,实现jwt工具类
@ConditionalOnProperty("auth.jwt.secret")
@Component
@Slf4j
public class JwtUtils {
@Value("${auth.jwt.secret}")
private String secret;
@Value("${auth.jwt.expiration}")
private Long expiration;
/**
* 定义系统标识头常量
*/
private static final String HEADER_SYSTEM_KEY = "systemKeyHeader";
/**