JWT令牌
简介
全称:JSON Web Token(JSON Web Tokens - jwt.io)
定义了一种简洁、自包含的格式,用于通信双方以json数据格式安全的传输信息。
组成:
第一部分:Header(头),记录令牌类型,签名算法等,例如{"alg":"HS256","type":"JWT"}
第二部分:Payload(有效载荷),携带一些自定义信息,默认信息等。例如:{"id":"1","username":"Tom"}
第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload、并加入指定秘钥,通过指定签名算法计算而来
引入依赖
<!-- jwt坐标-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
<!-- test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
创建测试类
package org.example;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import org.junit.jupiter.api.Test;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JwtTest {
@Test
public void testGen(){
Map<String,Object> claims=new HashMap<>();
claims.put("id",1);
claims.put("username","张三");
// 生成jwt代码
String token= JWT.create()
.withClaim("user",claims)//添加载荷
.withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*12))//有效时间
.sign(Algorithm.HMAC256("szpnkswdzaqpa"));//制定算法配置秘钥
System.out.println(token);
}
}
生成token令牌
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6IuW8oOS4iSJ9LCJleHAiOjE3MDU5MzUzNjV9.hPyWHNsE-VFA-TaItLAa0ExVDMNDgk15Pn98F1sygNo
JWT验证
测试验证
@Test
public void testParse(){
String token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" +
".eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6IuW8oOS4iSJ9LCJleHAiOjE3MDU5MzUzNjV9" +
".hPyWHNsE-VFA-TaItLAa0ExVDMNDgk15Pn98F1sygNo";
JWTVerifier jwtVerifier= JWT.require(Algorithm.HMAC256("szpnkswdzaqpa")).build();
DecodedJWT decodedJWT=jwtVerifier.verify(token);//验证token生成一个解析后的JWt对象
Map<String, Claim> claims=decodedJWT.getClaims();
System.out.println(claims.get("user"));
}
验证失败原因
篡改了头部和载荷数据部分验证失败
篡改秘钥验证失败
生成的token过期验证失败
注意事项
JWT校验时使用的签名秘钥,必须和生成 JWT 令牌时使用的秘钥是配套的 。
如果 JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,令牌非法 。