Skip to content

Commit 7b72da9

Browse files
committed
DSW011-JWT-token
1 parent 912dc47 commit 7b72da9

File tree

3 files changed

+187
-0
lines changed

3 files changed

+187
-0
lines changed

handsonDoc/DSW011-JWT-token.md

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
# DSW011-JWT-token
2+
3+
lin-jinwei
4+
5+
注意,未授权不得擅自以盈利方式转载本博客任何文章。
6+
7+
---
8+
9+
Code: [../code/](../code/)
10+
11+
12+
## JWT Json-Web-Token官网:https://jwt.io/
13+
14+
![alt text](image-64.png)
15+
16+
## 使用:
17+
18+
### gradel引入依赖
19+
20+
#### JWT-必需
21+
22+
```gradle
23+
implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.12.6'
24+
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.12.6'
25+
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.12.6'
26+
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.12.6'
27+
```
28+
29+
#### JWT-可选
30+
31+
32+
```gradle
33+
implementation group: 'com.google.code.gson', name: 'gson', version: '2.11.0'
34+
```
35+
36+
### 创建配置文件:
37+
代码:jwt.properties
38+
39+
```bash
40+
jwt.secret="12345678901234567890123456789012345678901234567890123456789012345678901234567890"
41+
jwt.iss="ISS_qianfafang"
42+
jwt.sub="SUBJECT_zhuti"
43+
#jwt.aud="ADU_jieshoufang"
44+
#jwt.exp="EXP_chaoshitime"
45+
#jwt.nbf="NBF_starttime"
46+
#jwt.iat="IAT_qianfatime"
47+
#jwt.jti="JTI_onlyID"
48+
```
49+
50+
51+
### JWT工具类-JWTUtil:
52+
代码:com/jinwei/{项目根目录}/JWTUtil.java
53+
54+
```java
55+
package com.jinwei.S8_mongotemplate;
56+
57+
import io.jsonwebtoken.*;
58+
import lombok.Data;
59+
import javax.crypto.SecretKey;
60+
import java.util.Date;
61+
import java.util.UUID;
62+
import io.jsonwebtoken.Jwts;
63+
import io.jsonwebtoken.security.Keys;
64+
import io.jsonwebtoken.security.SecureDigestAlgorithm;
65+
import org.springframework.beans.factory.annotation.Value;
66+
import org.springframework.context.annotation.Configuration;
67+
import org.springframework.context.annotation.PropertySource;
68+
import java.time.Instant;
69+
70+
@Data
71+
@PropertySource(value = { "jwt.properties" })
72+
@Configuration
73+
public class JWTUtil {
74+
// 设置token访问的过期时间-单位/分种
75+
private static final int MINUTE = 60;
76+
public static final int ACCESS_EXPIRE = 1 * MINUTE;
77+
78+
// 设置秘钥的加密算法
79+
private final static SecureDigestAlgorithm<SecretKey, SecretKey> ALGORITHM = Jwts.SIG.HS512;
80+
// 生成私钥,只能在服务器端保存
81+
// 使用Jwts.SIG.HS256 算法需要SECRET至少32位
82+
// 使用Jwts.SIG.HS512 算法需要SECRET至少64位
83+
// 设置密钥字符串
84+
private static String SECRET = "SECRET";
85+
86+
// 使用加密算法加密密钥字符串
87+
public static final SecretKey KEY = Keys.hmacShaKeyFor(SECRET.getBytes());
88+
89+
// 设置jwt签发者
90+
private static String JWT_ISS;
91+
92+
// 设置jwt主题
93+
private static String = "SUBJECT";
94+
95+
/* 常用声明:
96+
iss: jwt签发者-签发方
97+
sub: jwt主题-面向用户
98+
aud: jwt接受者-接受方
99+
exp: jwt过期时间-过期时间必须要大于签发时间
100+
nbf: jwt开始启用时间-定义在什么时间之前-jwt不可用的
101+
iat: jwt签发时间-过期时间必须要大于签发时间
102+
jti: jwt唯一身份标识-主要用来作为一次性token-回避重放攻击
103+
*/
104+
public static String genJWTToken(String inputStr) {
105+
// 生成令牌id-UUID.randomUUID()-随机
106+
String uuid = UUID.randomUUID().toString();
107+
Date exprireDate = Date.from(Instant.now().plusSeconds(ACCESS_EXPIRE));
108+
109+
return Jwts.builder()
110+
// 设置头部信息-header
111+
.header()
112+
.add("type", "JWT")
113+
.add("algo", "HS512")
114+
.and()
115+
// 设置负载信息-payload
116+
.claim("username", inputStr)
117+
// 设置令牌ID
118+
.id(uuid)
119+
// 设置过期日期
120+
.expiration(exprireDate)
121+
// 设置签发时间
122+
.issuedAt(new Date())
123+
// 设置主题
124+
.subject(SUBJECT)
125+
// 设置签发者
126+
.issuer(JWT_ISS)
127+
// 设置签名
128+
.signWith(KEY, ALGORITHM)
129+
.compact();
130+
}
131+
132+
// 解析token-claim
133+
public static Jws<Claims> parseClaim(String token) {
134+
return Jwts.parser()
135+
.verifyWith(KEY) // 必须持有相同的KEY才能解析
136+
.build()
137+
.parseSignedClaims(token);
138+
}
139+
140+
// 解析头部-Header
141+
public static JwsHeader parseHeader(String token) {
142+
return parseClaim(token).getHeader();
143+
}
144+
145+
// 解析负载-Payload
146+
public static Claims parsePayload(String token) {
147+
return parseClaim(token).getPayload();
148+
}
149+
150+
}
151+
```
152+
153+
## 测试主文件
154+
155+
```java
156+
package com.jinwei.S8_mongotemplate;
157+
158+
import com.google.gson.Gson;
159+
import org.springframework.boot.SpringApplication;
160+
import org.springframework.boot.autoconfigure.SpringBootApplication;
161+
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
162+
163+
import java.util.Date;
164+
165+
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
166+
public class S8MongotemplateApplication {
167+
168+
public static void main(String[] args) {
169+
// SpringApplication.run(S8MongotemplateApplication.class, args);
170+
171+
User user = new User("user2", "123");
172+
String subject = new Gson().toJson(user);
173+
174+
JWTUtil jwtUtil = new JWTUtil();
175+
String jwtoken = jwtUtil.genJWTToken(subject);
176+
177+
System.out.println("jwtoken = " + jwtoken);
178+
System.out.println("jwtUtil.parseClaim(jwtoken) = " + jwtUtil.parseClaim(jwtoken));
179+
System.out.println("jwtUtil.parsePayload(jwtoken) = " + jwtUtil.parsePayload(jwtoken));
180+
181+
}
182+
183+
}
184+
```
185+
186+
187+
File renamed without changes.

handsonDoc/image-64.png

253 KB
Loading

0 commit comments

Comments
 (0)