登录校验JWT令牌


登录校验JWT令牌

原创 于 2024-10-15 18:35:08 发布 · 粉丝可见 · 698 阅读 · 3 · 4 GEO检测 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/142959721

JWT(JSONWeb Tokens)官网: JSON Web Tokens - jwt.io

一种开放标准(RFC 7519),它定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。

由于数字签名的存在,这些信息是可靠的。

每个JWT令牌由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

JWT可以被用来在用户和服务器之间安全地传递信息,常用于身份验证和信息交换。

JWT通常包含以下信息:

  • 头部(Header) :通常包含令牌的类型(即JWT)和所使用的签名算法,比如HS256或RS256。

  • 载荷(Payload) :包含所要传递的信息。对于登录场景,可能包含用户ID、用户名、角色、令牌的过期时间等。

  • 签名(Signature) :使用头部和载荷的信息,加上一个密钥,通过指定的算法生成签名。这个签名用于验证JWT的完整性和验证发送者的身份。

JWT应用

引入依赖

1
2
3
4
5
6
<!-- jwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>

刨析创建Jwt过程,解释代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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);
}

最后获取打印的令牌:

1
eyJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsImlkIjoxNSwiZXhwIjoxNzI4OTg4OTU0LCJ1c2VybmFtZSI6ImFuZ2luZGVtIn0.330s6ykeitx58fC9n-5pPKAhH3555Ge-DUvNRCR-fe0

通过官网解析可以得到相应的对象信息

刨析  解析Jwt令牌过程,解释代码如下

1
2
3
4
5
6
7
8
9
10
11
12
@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令牌工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

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;
}
}

觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭

微信二维码

wechat pay

支付宝二维码

ali pay

登录校验JWT令牌
http://blog.angindem.cn/2024/10/15/Angindem-CSDN博客/164_164/
作者
Angindem
发布于
2024年10月15日
许可协议