登录校验JWT令牌
JWT(JSON Web Tokens)官网:JSON Web Tokens - jwt.io
一种开放标准(RFC 7519),它定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。
由于数字签名的存在,这些信息是可靠的。
每个JWT令牌由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
JWT可以被用来在用户和服务器之间安全地传递信息,常用于身份验证和信息交换。
JWT通常包含以下信息:
- 头部(Header):通常包含令牌的类型(即JWT)和所使用的签名算法,比如HS256或RS256。
- 载荷(Payload):包含所要传递的信息。对于登录场景,可能包含用户ID、用户名、角色、令牌的过期时间等。
- 签名(Signature):使用头部和载荷的信息,加上一个密钥,通过指定的算法生成签名。这个签名用于验证JWT的完整性和验证发送者的身份。
JWT应用
引入依赖
<!-- jwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
刨析创建Jwt过程,解释代码如下
@Test
public void testCreateJwt() {
// 定义信息的载荷
Map<String, Object> claims = new HashMap<>();
claims.put("id", 15);
claims.put("username", "angindem");
claims.put("password", "123456");
String jwt = Jwts.builder() // 通过调用 Jwts 的内置工具类 的 builder 进行 jwt 令牌的创建
.signWith(SignatureAlgorithm.HS256, "angindem") // 注册头部信息 Jwt 令牌 的数字签名, 其中第一个参数是 jwt 的签名算法,第二个参数是自定义的数字签名
.setClaims(claims) // 存储需传递的信息载荷
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)) // 定义 令牌的有效期 为 1h 这里 是 ms单位
.compact();// 生成 String 的 jwt 令牌
System.out.println(jwt);
}
最后获取打印的令牌:
eyJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsImlkIjoxNSwiZXhwIjoxNzI4OTg4OTU0LCJ1c2VybmFtZSI6ImFuZ2luZGVtIn0.330s6ykeitx58fC9n-5pPKAhH3555Ge-DUvNRCR-fe0
通过官网解析可以得到相应的对象信息
刨析 解析Jwt令牌过程,解释代码如下
@Test
public void testParseJwt(){
String jwt = "eyJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsImlkIjoxNSwiZXhwIjoxNzI4OTg4OTU0LCJ1c2VybmFtZSI6ImFuZ2luZGVtIn0.330s6ykeitx58fC9n-5pPKAhH3555Ge-DUvNRCR-fe0";
Claims claims = Jwts.parser()
.setSigningKey("angindem") // 设置我们注册对应Jwt的解析密钥
.parseClaimsJws(jwt) // 解析 jwt 令牌
.getBody(); // 获取解析后的实体
System.out.println(claims);
}
最后解析结果:
Jwt令牌工具类
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
public class JwtUtils {
private static String signKey = "Angindem"; // 令牌数字签名
private static Long expire = 43200000L; // 令牌有效期 12 小时
// 创建Jwt令牌
public static String getJwt(Map<String,Object> claims){
String jwt = Jwts.builder()
.signWith(SignatureAlgorithm.HS256, signKey)
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + expire))
.compact();
return jwt;
}
// 解析 Jwt 令牌
public static Claims parseJwt(String jwt){
Claims claims = Jwts.parser()
.setSigningKey(signKey)
.parseClaimsJws(jwt)
.getBody();
return claims;
}
}
原文地址:https://blog.csdn.net/hacker_51/article/details/142959721
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!