You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spring-boot-online-exam/doc/references/JWT校验.md

159 lines
5.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# JWT校验
## 参考教程
+ [彻底理解cookie、session、token](https://github.com/19920625lsg/VueStudy/blob/master/VueJD/%E7%AC%AC3%E7%AB%A0_%E6%B3%A8%E5%86%8C%E7%99%BB%E5%BD%95%E5%AE%9E%E6%88%98/%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3cookie_session%E5%92%8Ctoken.md)
+ [小D课堂在线教育系统之JWT校验](https://edu.51cto.com/center/course/lesson/index?id=280435)
## 开发在线教育视频站点核心业务之JWT微服务下的用户登录权限校验
### 1、单机和分布式应用的登录检验讲解
> 简介讲解单机和分布式应用下登录校验session共享分布式缓存使用
![登录校验方案](images/登录校验方案.png)
#### 1.1、单机tomcat应用登录检验
![单机tomcat应用登录检验](images/单机tomcat应用登录检验.png)
+ sesssion保存在浏览器和应用服务器会话之间
+ 用户登录成功服务端会保证一个session当然会给客户端一个sessionId
+ 客户端会把sessionId保存在cookie中每次请求都会携带这个sessionId
#### 1.2、分布式应用中session共享
> 真实的应用不可能单节点部署所以就有个多节点登录session共享的问题需要解决
+ 1tomcat支持session共享但是有广播风暴用户量大的时候占用资源就严重不推荐
![tomcat开启session共享](images/tomcat开启session共享.png)
+ 2使用redis存储token
> 服务端使用UUID生成随机64位或者128位token放入redis中然后返回给客户端并存储在cookie中用户每次访问都携带此token服务端去redis中校验是否有此用户即可
![使用redis存储token](images/登录校验方案.png)
### 2、微服务下登录检验解决方案 JWT讲解
> 简介:微服务下登录检验解决方案 JWT讲解 `json wen token`
![JWT概要](images/JWT概要.png)
#### 2.1、JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。
> JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名
简单来说就是通过一定规范来生成token然后可以通过解密算法逆向解密token这样就可以获取用户信息
```json
{
"id":888,
"name":"小D",
"expire":10000
}
```
```javascript
funtion 加密(object, appsecret){
xxxx
return base64( token);
}
```
```javascript
function 解密(token ,appsecret){
xxxx
//成功返回true,失败返回false
}
```
+ 优点:
+ 1生产的token可以包含基本信息比如id、用户昵称、头像等信息避免再次查库
+ 2存储在客户端不占用服务端的内存资源
+ 缺点:
+ token是经过base64编码所以可以解码因此token加密前的对象不应该包含敏感信息如用户权限密码等
#### 2.2、JWT格式组成 头部、负载、签名
> header+payload+signature
+ 头部:主要是描述签名算法
+ 负载主要描述是加密对象的信息如用户的id等也可以加些规范里面的东西如iss签发者exp 过期时间sub 面向的用户
+ 签名主要是把前面两部分进行加密防止别人拿到token进行base解密后篡改token
![JWT概要](images/JWT概要.png)
#### 2.3、关于jwt客户端存储
> 可以存储在cookielocalstorage和sessionStorage里面
### 3、登录检验JWT实战之封装通用方法
> 讲解引入相关依赖并开发JWT工具类
### 3.11、加入相关依赖
```xml
<!-- JWT相关 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
```
### 3.2、开发生产token方法
### 3.3、开发检验token方法
## 4、Springboot2.x用户登录拦截器开发实战
> 简介:实战开发用户登录拦截器拦截器 LoginInterceptor
### 4.1、实现接口 LoginInterceptor implements HandlerInterceptor
### 4.2、重写preHandler
```java
String accessToken = request.getHeader("token");
if(accessToken == null){
accessToken = request.getParameter("token");
}
if (accessToken != null ) {
Claims claims = JWTUtils.checkJWT(accessToken);
Integer id = (Integer)claims.get("id");
String name = (String)claims.get("name");
request.setAttribute("user_id",id);
request.setAttribute("name",name);
//普通用户
return true;
}
return false;
```
### 4.3、配置拦截器
```java
@Configuration
InterceptorConfig implements WebMvcConfigurer
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/api/v1/*/**");
WebMvcConfigurer.super.addInterceptors(registry);
}
```
### 4.4、响应前端数据
```java
public static void sendJsonMessage(HttpServletResponse response, Object obj) throws Exception {
Gson g = new Gson();
response.setContentType("application/json; charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print(g.toJson(obj));
writer.close();
response.flushBuffer();
}
```