IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> jwt笔记 -> 正文阅读

[开发测试]jwt笔记

jwt

简介链接:https://www.bilibili.com/video/BV1cK4y197EM?spm_id_from=333.337.search-card.all.click

具体文章:https://www.baobao555.tech/posts/4cc42459/

什么是jwt

JSON Web Token,通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全的传输信息。

应用场景

JWT最常见的场景就是授权认证,一旦用户登录,后续每个请求都将包含JWT,系统在每次处理用户请求的之前,都要先进行JWT安全校验,通过之后再进行处理。

jwt的组成

由三部分组成,用.拼接

JWTString = Base64(Header).
Base64(Payload).
HMACSHA256(
	(
		base64UrlEncode(header) + “.” 
		+ base64UrlEncode(payload)
	), secret
)

这三部分分别是:

  • header
{
	'typ': 'JWT' # token的类型
	'alg': 'HS256' # 加密算法名称
}

通过base64编码,形成第一部分

  • PayLoad(载荷)
    存放有效信息的部分
{
	"name": 'czc'
}

通过base64编码,形成第二部分

  • Signature (签名)
    把header和payload部分的先通过base64编码并连接,再通过header中的加密方式把刚刚得到的字符串再次加密,形成第三部分
var encodedstring = base64Ur1Encode(header) + 
'.’ + base64ur1Encode(pay1oad);

var signature = HMACSHA256(encodedstring,'secret');

依赖

<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.19.1</version>
</dependency>

加密解密(对称签名)

加密

Map<String, Object> header = new HashMap<>();
header.put("typ", "JWT");
header.put("alg", "HS256");

String jwtToken = JWT.create()
        // 设置header
        .withHeader(header)
        // 设置payload(携带信息)
        .withClaim("username", "czc")
        .withClaim("password", 1244)
        // 设置主题
        .withSubject("测试")
        // 设置过期时间
        .withExpiresAt(new Date(System.currentTimeMillis() + overTime))
        // 设置签名
        .sign(Algorithm.HMAC256("czc"));

System.out.println(jwtToken);

解密:

 String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLmtYvor5UiLCJwYXNzd29yZCI6MTI0NCwiZXhwIjoxNjUwMTg0MDQzLCJ1c2VybmFtZSI6ImN6YyJ9.Uifc9hO3Givnp0iYPSXhTdsNNjo_L8NSNVBZXA87NNQ";
 // 创建解析对象,使用的算法和secret要与创建token时保持一致
 JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("czc")).build();
 // 解析指定的token
 DecodedJWT decodedJWT = jwtVerifier.verify(token);
 // 获取解析后的token中的payload信息
 Claim password = decodedJWT.getClaim("password");
 Claim userName = decodedJWT.getClaim("username");

 System.out.println(password.asInt());
 System.out.println(userName.asString());
 // 输出超时时间
 System.out.println(decodedJWT.getExpiresAt());
 System.out.println(decodedJWT.getSignature());
 System.out.println(decodedJWT.getHeader());

整合springboot

在实际的SpringBoot项目中,一般我们可以用如下流程做登录:

  1. 在登录验证通过后,给用户生成一个对应的随机token(注意这个token不是指jwt,可以用uuid等算法生成),然后将这个token作为key的一部分,用户信息作为value存入Redis,并设置过期时间,这个过期时间就是登录失效的时间
  2. 将第1步中生成的随机token作为JWT的payload,生成JWT字符串返回给前端
  3. 前端之后每次请求都在请求头中的Authorization字段中携带JWT字符串
  4. 后端定义一个拦截器,每次收到前端请求时,都先从请求头中的Authorization字段中取出JWT字符串并进行验证,验证通过后解析出payload中的随机token,然后再用这个随机token得到key,从Redis中获取用户信息,如果能获取到就说明用户已经登录
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 18:12:40  更:2022-04-18 18:14:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 22:34:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码