JSON Web Token
1.什么是JWT?
JSON Web Token (JWT)是?個開放標(biāo)準(zhǔn)(RFC 7519),它定義了?種緊湊的、?包含的?式,?于
作為JSON對象在各?之間安全地傳輸信息。該信息可以被驗(yàn)證和信任,因?yàn)樗菙?shù)字簽名的。
1.1.什么時(shí)候應(yīng)該用JWT?
JSON Web Token (JWT)是?個開放標(biāo)準(zhǔn),它定義了?種緊湊的、?包含的?式,?于
作為JSON對象在各?之間安全地傳輸信息。該信息可以被驗(yàn)證和信任,因?yàn)樗菙?shù)字簽名的。
1.2.認(rèn)證流程

image-20210827165954270

image-20210827170034117

image-20210827170041709
1.3.JWT的優(yōu)勢在哪?

image-20210827170106840
1.4.JWT具體包含的信息
1.header

image-20210827170148205
2.Payload

image
3.Signature

image-20210827170243910
2.SpringBoot JWT 初始化
2.1整合POM
<dependencies>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.0</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!--jwt-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.18.1</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.2測試JWT加密流程

image-20210827170525494

image-20210827170537381
3.封裝工具類JWTUtils

image-20210827170611141
4.登錄接口邏輯
@GetMapping("/user/login")
public Map<String, Object> login(User user) {
HashMap<String, Object> map = new HashMap<>();
try {
// find user in DB
User userDB = userService.login(user);
HashMap<String, String> payload = new HashMap<>();
// add info into payload
payload.put("id", String.valueOf(userDB.getId()));
payload.put("name", userDB.getName());
// 生成JWT的令牌
String token = JWTUtils.getToken(payload);
// return info to user login
map.put("state", true);
map.put("msg", "認(rèn)證成功");
map.put("token", token);
} catch (Exception e) {
// can't find user
map.put("state", false);
map.put("msg", e.getMessage());
}
return map;
}
5.驗(yàn)證Token邏輯(原始)
@PostMapping("/user/test")
public Map<String, Object> test(String token) {
HashMap<String, Object> map = new HashMap<>();
/*
try {
JWTUtils.verify(token);
map.put("state", true);
map.put("msg", "請求成功!");
return map;
} catch (SignatureVerificationException e) {
// 過期異常
e.printStackTrace();
map.put("msg", "無效簽名!");
} catch (TokenExpiredException e) {
// token不一致異常
e.printStackTrace();
map.put("msg", "token過期!");
} catch (AlgorithmMismatchException e) {
// 算法不一致異常
e.printStackTrace();
map.put("msg", "算法不一致!");
} catch (Exception e) {
e.printStackTrace();
map.put("msg", "無效簽名!");
}
map.put("state", false);
*/
// 處理自己的業(yè)務(wù)邏輯
map.put("state", true);
map.put("msg", "請求成功");
return map;
}
6.JWT過濾器簡化驗(yàn)證Token邏輯

image-20210827170642222
6.1創(chuàng)建JWT登錄過濾器

image-20210827170650576
6.2注冊JWT過濾器到Spring容器中

image-20210827170702967