JWT快速入门及日常使用

news2024/11/23 12:19:53

什么是JWT

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

JWT有什么用

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

JWT组成

JWT由3部分组成,用"."拼接

  • Header(头部)
  • Payload(载荷)
  • Signature(签名)
    三部分最终组合成完整的字符串,中间使用 . 分隔, 如下:
  • Header.Payload.Signature

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6IuW8oOS4iSIsInJvbGUiOiJhZG1pbiIsInN1YiI6InRva2VuLXRlc3QiLCJleHAiOjE2ODM1NDg4ODcsImp0aSI6ImM0N2VlN2FmLWNkZTUtNGI2NC1iMzlmLWJlODNiYWY0NTI0NCJ9.eLGLfNl6Pt6se3MqaKI7u0mcxG5woUCwF_585W7l3WQ

  • Header

    {
    	"typ":"JWT",
    	"alg":"HS256"
    }
    
    • Header部分是一个json对象,描述JWT的元数据
    • alg:签名的算法(algorithm),默认是HMAC SHA256(简写 HS256)
    • typ:令牌(token)类型(type),JWT令牌统一写成 JWT
    • 最后,将上面的JSON对象使用Base64URL算法转成字符串
  • Payload

    {
    	"sub":"1234567890",
    	"name":"john",
    	"admin":true
    }
    
    • Payload部分也是一个JSON对象,用来存放实际需要传递的数据,JWT规定7个官方字段,供选用
      • iss(issuer):签发人
      • exp(expiration time):过期时间
      • sub(subject):主题
      • aud(audience):受众
      • nbf(Not Before):生效时间
      • iat(Issued At):签发时间
      • jti(JWT ID):编号
    • 注意,JWT默认是不加密的,任何人都可以读到,所以不要吧秘密信息放在这个部分
    • 这个JSON对象也要使用Base64URL算法转成字符串
  • Signature

    HMACSHA256(
    	base64UrlEncode(header) + "." +  
    	base64UrlEncode(payload),
    	"secret");
    
    • SIgnature部分是对前两部分的签名,防止数据篡改
    • 首先,需要指定一个密钥(secret)。这个密钥只有服务端知道,不能泄露给用户
    • 然后,使用Header里面指定的签名算法(默认是HMAC SHA256),按照上面的公式生成签名

    在这里插入图片描述

案例测试

  • 依赖引入
<!--jwt依赖-->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.0</version>
</dependency>
  • JWT生成token
  @Test
    public void jwtCreate() {
        JwtBuilder builder = Jwts.builder();
        String token = builder
                //Header
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")
                //Payload
                .claim("username", "张三")
                .claim("role", "admin")
                .setSubject("token-test")
                .setExpiration(new Date(System.currentTimeMillis() + expiration))
                .setId(UUID.randomUUID().toString())
                //signature
                .signWith(SignatureAlgorithm.HS256, signature)
                .compact();
        System.out.println(token);
    }
  • JWT解密token

    @Test
    public void jwtParse() {
        String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6IuW8oOS4iSIsInJvbGUiOiJhZG1pbiIsInN1YiI6InRva2VuLXRlc3QiLCJleHAiOjE2ODM1NDg4ODcsImp0aSI6ImM0N2VlN2FmLWNkZTUtNGI2NC1iMzlmLWJlODNiYWY0NTI0NCJ9.eLGLfNl6Pt6se3MqaKI7u0mcxG5woUCwF_585W7l3WQ";
        JwtParser parser = Jwts.parser();
        Jws<Claims> claimsJws = parser.setSigningKey(signature).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        System.out.println("Subject: "+ claims.getSubject());
        System.out.println("username: "+ claims.get("username"));
        System.out.println("role: "+ claims.get("role"));

    }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/500193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

总结下自己编译alembic的过程

编译alembic过程回顾 前言 总结下自己编译alembic的过程 最近想学习编译啥的&#xff0c;就想着一边编译着&#xff0c;一边学习的&#xff0c;刚好&#xff0c;拿alembic编译练手&#xff0c;记录下自己编译的过程吧。 编译的使用的是Visual Studio 2022&#xff0c;python…

【性能设计篇】性能设计-缓存

前言 在分布式系统中&#xff0c;最耗费性能的地方就是数据库&#xff0c;而对于数据库的操作基本上就是添加&#xff0c;修改&#xff0c;删除和查询&#xff0c;对于前3者来说&#xff0c;基本上不会出现性能瓶颈。最耗费性能的地方就是查询了&#xff0c;对于查询有join、w…

Kafka相关知识

一、基本概念及流程 Broker:kafka集群中的实例Topic:队列的主题,逻辑概念;Partition:Topic分区,物理概念,同意parttion内消息有序;Producer & Consumer:生产消息的客户端 & 消费消息的客户端,kafka认为是服务器。将每个Topic划分为多个分区Partition,每个分…

Vim (NeoVim) 配置

Vim 基础 模式 o 代表的是open a new line i 代表的是insert a 代表的是append Visual [Character] 视觉模式&#xff1a;用于选择单个字符&#xff08;v小写’v’&#xff09;视觉线模式&#xff1a;用于一次选择整条线&#xff08;V大写“V”&#xff09;视觉块模式&#…

深度学习数据集—动物数据集大合集(二)

近期又整理了一批各类动物数据集&#xff0c;分享给大家。废话不多说&#xff0c;直接上干货&#xff01;&#xff01; 1、151种动物图片数据集共6271张&#xff0c;图片大小&#xff1a;224x224 jpg ​ ​ 下载地址&#xff1a;151种动物图片数据集 2、9种海洋生物&#xff0…

C++学习之字符常量、字符串常量和符号常量的区别

字符常量 字符常量就是把一个字符用单引号括起来。 注&#xff1a; 字符常量只能包含一个字符&#xff0c;如’AB’是不合法的字符常量区分大小写字母单引号“ ’ ”是定界符&#xff0c;而不属于字符常量的一部分 字符串常量 字符串常量时用双引号括起来的字符序列。 举例…

kill 命令信号详解

信号 列出所有信号 $ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18…

【数据结构】交换排序(详细)

交换排序 1. 冒泡排序2. 快速排序2.1霍尔版本2.2 挖坑法2.3 前后指针法&#xff08;最优&#xff09;2.4 小区间优化2.5 非递归快排 1. 冒泡排序 思想 排升序&#xff1a;每趟将前后两元素进行比较&#xff0c;按照“前小后大”进行交换&#xff0c;将最大的元素放在最后。 排…

Solr(3):Solr的名词解释及配置文件说明

1 名称解释 1.1 索引库 我们导入数据&#xff0c;solr 会被它以某种格式保存在索引库里面&#xff01; 可以看出刚安装的现在没有任何索引库 1.2 索引分词 Solr在导入数据库时&#xff0c;会对某些语句进行分词 1.3 搜索分词 Solr在搜索数据库时&#xff0c;会对某些语句进…

PyQt5桌面应用开发(10):界面布局基本支持

本文目录 PyQt5桌面应用系列布局利器游戏总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件循环 PyQt5桌面应用开发&#xff08;3&#xff09;&#xff1a;并行设计 PyQt5桌…

星火认知大模型发布,科大讯飞入场科技巨头AI大战?

自从ChatGPT横空出世&#xff0c;一个更美好的世界开始向我们招手。为了推开新时代的大门&#xff0c;几乎所有人工智能厂商都投入了最大的热情逐浪AIGC。 5月6日&#xff0c;科大讯飞召开了“讯飞星火认知大模型”成果发布会。发布会现场&#xff0c;科大讯飞董事长刘庆峰展示…

Hadoop[3.3.x]-1本地环境搭建

环境&#xff1a;Mac Hadoop版本&#xff1a;Apache Hadoop 3.3.4 由于hadoop依赖java环境&#xff0c;所以需要事先安装好java。 Hadoop下载 进入官网进行下载Apache Hadoop 下载后解压到自己的规划的目录。 环境文件配置 Hadoop相关配置文件都在目录的../hadoop-3.3.4/et…

Vulkan 总结

一、Vulkan 对象简介 1、VKInstance 这个对象是我们 Vulkan api 的一个对象&#xff0c;用于通过 Instance 我们与 Vulkan 底层进行交互。 2、VkPhysicalDevice 对应我们当前设备&#xff08;PC、手机&#xff09;的一个显卡硬件&#xff08;GPU &#xff09;&#xff0c;有的…

如何导出cloudflare warp内部存的私钥和token

结论&#xff1a;管理员身份运行 mimikatz&#xff1a;https://github.com/gentilkiwi/mimikatz/releases/tag/2.2.0-20220919 然后输入&#xff1a; privilege::debug &#xff08;提升权限到&#xff1a;NT-AUTHORITY\SYSTEM&#xff09;以及sekurlsa::credman 就能看到&…

Java中的反射(通过反射获取类的结构、invoke方法、获取注解)

文章目录 1. 创建运行时类的对象2. 获取运行时类的完整结构2.1 相关API2.2 获取所有的属性及相关细节2.3 获取所有的方法及相关细节2.4 获取其他结构(构造器、父类、接口、包、注解等)2.5 获取泛型父类信息2.6 获取内部类或外部类信息2.7 总 结 3. 调用运行时类的指定结构3.1 调…

HDOJ 1022 Train Problem Ⅰ 模拟栈操作

&#x1f351; OJ专栏 &#x1f351; HDOJ 1022 Train Problem Ⅰ 输入 3 123 321 3 123 312输出 Yes. in in in out out out FINISH No. FINISH&#x1f351; 思路 &#x1f364; 栈顶元素与目标元素不匹配就进栈&#xff0c;匹配就出栈 &#x1f364; 匹配完&#xff1a;y…

es 7.0.8 常用操作(windwos版本安装,索引crud操作)

一 es7.x的核心 1.1 es的核心概念 1.ES 里的 Index 可以看做一个库(名称必须为小写)&#xff0c;而 Types 相当于表&#xff0c;Documents 则相当于表的行。 2.这里 Types 的概念已经被逐渐弱化&#xff0c;Elasticsearch 6.X 中&#xff0c;一个 index 下已经只能包含一个…

分布式搜索引擎——elasticsearch搜索功能

DSL查询语法 DSL Query的分类 Elasticsearch提供了基于JSON的DSL (Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据&#xff0c;一般测试用。例如:match_all全文检索(full text)查询:利用分词器对用户输入内容分词&#xff0c;然后去倒排…

Java 基础进阶篇(九)—— Java集合详细总结

文章目录 一、集合类体系结构二、Collection系列集合2.1 Collection 集合体系2.2 Collection 集合体系特点2.3 Collection 常用API2.4 Collection 集合的遍历方式2.4.1 方式一&#xff1a;迭代器2.4.2 方式二&#xff1a;foreach&#xff08;增强for循环&#xff09;2.4.3 方式…

Java8新特性—Optional类

前言 Java 8中引入了一个新的Optional类&#xff0c;它可以让开发人员更好地处理可能为空的值。Optional类提供了一种方式&#xff0c;可以更加优雅地处理null值&#xff0c;并在运行时避免NullPointerException异常的出现。本文将介绍Optional类的基本语法、使用场景和示例。…