JWT简介 JWT结构 JWT示例 前端添加JWT令牌功能 后端程序

news2024/12/22 16:18:14

目录

1. JWT简述

1.1 什么是JWT

1.2 为什么使用JWT

1.3 JWT结构

1.4 验证过程

2. JWT示例

2.1 后台程序

2.2 前台加入jwt令牌功能


1. JWT简述

1.1 什么是JWT

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案

1.2 为什么使用JWT

传统的intenet服务的认证是通过session进行的,当用户通过了安全认证后,则在服务端的session对象中保存该用户的认证信息,这样该用户对服务的访问被认为是安全的。这种模式的最大问题是没有分布式架构,不方便进行横向扩展,这种模式只适合于单体应用模式。如果需要进行服务集群则需要处理好共享session的问题。 如果一个庞大的系统需要按服务分解为多个独立的服务,使用分布式架构,则这种方式更难处理。使用jwt可以方便的处理上面提到的问题。

1.3 JWT结构

 

JWT头
JWT头部分是一个描述JWT元数据的JSON对象,通常如下所示。{"alg": "HS256","typ": "JWT"}。

有效载荷
有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。这些声明被JWT标准称为claims。
例如:{"sub":"123","name":"Tom","admin":true},sub代表这个token的所有人,存储的是所有人的ID;name表示这个所有人的名字;admin表示所有人是否管理员的角色。当后面对JWT进行验证的时候,这些claim都能发挥特定的作用。
根据JWT的标准,这些claims可以分为以下三种类型:
A. Reserved claims(保留)
它的含义就像是编程语言的保留字一样,属于JWT标准里面规定的一些claim。JWT标准里面定义好的claim有:
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

B. Public claims,略(不重要)

C. Private claims(私有)
这个指的就是自定义的claim,比如前面那个示例中的admin和name都属于自定的claim。这些claim跟JWT标准规定的claim区别在于:JWT规定的claim,JWT的接收方在拿到JWT之后,都知道怎么对这些标准的claim进行验证;而private claims不会验证,除非明确告诉接收方要对这些claim进行验证以及规则才行。
按照JWT标准的说明:保留的claims都是可选的,在生成payload不强制用上面的那些claim,你可以完全按照自己的想法来定义payload的结构,不过这样搞根本没必要:第一是,如果把JWT用于认证, 那么JWT标准内规定的几个claim就足够用了,甚至只需要其中一两个就可以了,假如想往JWT里多存一些用户业务信息,比如角色和用户名等,这倒是用自定义的claim来添加;第二是,JWT标准里面针对它自己规定的claim都提供了有详细的验证规则描述,每个实现库都会参照这个描述来提供JWT的验证实现,所以如果是自定义的claim名称,那么你用到的实现库就不会主动去验证这些claim。

signature
签名的作用是防篡改。签名是把header和payload对应的json结构进行base64url编码之后得到的两个串用英文句点号拼接起来,然后根据header里面alg指定的签名算法生成出来的。算法不同,签名结果不同。以alg: HS256为例来说明前面的签名如何来得到。照前面alg可用值的说明,HS256其实包含的是两种算法:HMAC算法和SHA256算法,前者用于生成摘要,后者用于对摘要进行数字签名。这两个算法也可以用HMACSHA256来统称

JWT实际结构示例:
eyJhbGciOiJIUzI1NiJ9. eyJzdWIiOiJ7fSIsImlzcyI6InpraW5nIiwiZXhwIjoxNTYyODUwMjM3LCJpYXQiOjE1NjI4NDg0MzcsImp0aSI6ImM5OWEyMzRmMDc4NzQyZWE4YjlmYThlYmYzY2VhNjBlIiwidXNlcm5hbWUiOiJ6c3MifQ. WUfqhFTeGzUZCpCfz5eeEpBXBZ8-lYg1htp-t7wD3I4

1.4 验证过程

客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中,此后在于服务器的交互中都携带者JWT信息,它验证的方法其实很简单,只要把header做base64url解码,就能知道JWT用的什么算法做的签名,然后用这个算法,再次用同样的逻辑对header和payload做一次签名,并比较这个签名是否与JWT本身包含的第三个部分的串是否完全相同,只要不同,就可以认为这个JWT是一个被篡改过的串。

2. JWT示例

2.1 后台程序

1)将资料中src目录下的代码(CorsFilter.java,JwtFilter.java,JwtUtils.java)拷入项目的util目录下(可以根据项目设置的目录结构调整)。
2)程序的解释详见代码中的注释
3)在web.xml中配置JwtFilter过滤器
4)在用户登录验证成功后,需要为该用户生成jwt令牌,具体实现可参考UserAction.java
5)测试后台的验证服务,确定在验证通过的前提下可以正确的生成jwt令牌。

2.2 前台加入jwt令牌功能

1) 在store/state.js中加入jwt变量

//存放全局参数的容器,组件可以通过state.js获取全局参数
const state = {
  LeftAsideState: 'open',
  PersonName:'张飞',
  
  //存放jwt令牌
  jwt:null
}

export default state

2)在store/mutations.js中加入设置jwt方法

  //设置JWT令牌
  setJwtToken: (state, payload) => {
    state.jwt = payload.jwt;
  }

3)在store/getters.js中加入获取jwt的方法

  //获取jwt令牌
  getJwtToken: function(state) {
    return state.jwt;
  }

4)修改main.js应用入口

//将vue实例赋给window.vm属性,以便于在http.js的响应拦截器和请求拦截器中获取vue实例
window.vm = new Vue({
  el: '#app',
  router,
  store,
  components: {App},
  template: '<App/>'
})

5)完善api/http.js中的请求拦截器和响应拦截器

// 请求拦截器
axios.interceptors.request.use(function(config) {
  //获取store中的jwt令牌,如果正常获取,将其放入请求头,
  //在调用后台服务时,服务会通过过滤器验证jwt令牌的有效性
  //如果没有令牌或令牌无效则拒绝服务。
  let jwt = window.vm.$store.getters.getJwtToken;
  if(jwt) {
    config.headers['jwt'] = jwt;
  }
  return config;
}, function(error) {
  return Promise.reject(error);
});

// 响应拦截器
axios.interceptors.response.use(function(response) {
  //获取响应头中的jwt令牌数据(认证服务将生成的令牌放入header的jwt属性中)
  //如果获取到jwt令牌,在保存到store中,以后发送请求时需要将令牌放入请求头
  let jwt = response.headers['jwt'];
  if(jwt) {
	  window.vm.$store.commit('setJwtToken',{jwt:jwt});
  }
  return response;
}, function(error) {
  return Promise.reject(error);
});

完毕,测试 

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

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

相关文章

44A751101-G01 469-P1-HI-A20-E 489-P5-LO-A20

44A751101-G01 469-P1-HI-A20-E 489-P5-LO-A20 在整合IIoT技术的同时&#xff0c;IT/oT融合实施团队将继续就OT网络与公司网络的隔离、OT网络与互联网的隔离、站点和流程级别的最低权限访问控制以及跨站点通信限制做出决策。与此同时&#xff0c;网络安全领域的专业知识正在发…

C++使用serial串口通信 + ROS2程序示例

目录 一、通信协议二、串口调试工具三、serial库的使用3.1 安装serial3.2 serial的使用3.3 绑定端口 四、串口程序示例 串行接口 &#xff08;Serial Interface&#xff09;简称串口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方式的扩展接口&#xff0c…

纷享销客获评中小企业数字化转型优质服务商

近日&#xff0c;纷享销客成功入选长沙市工信局评定的【中小企业数字化转型优质服务商】&#xff0c;专业服务实力得到官方认可&#xff01; 今年6月&#xff0c;财政部、工信部联合印发《关于开展中小企业数字化转型城市试点工作的通知》&#xff0c;长沙市成功入选首批中小企…

【2021研电赛】基于ADRC的双轴反作用轮自平衡杆

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力&#xff0c;更有重磅电子产品免费领取! 论文题目&#xff1a; 基于ADRC的双轴反作用轮自平衡杆 Dual-axis reaction wheel self-balancing rod based on ADRC 参赛单位&#xff1a; 广西科技大学 队伍名称&#x…

使用VMware安装centos虚拟机

下载资源 VMware下载&#xff1a; vmware下载地址 centos镜像下载地址&#xff1a; 下载地址 创建虚拟机 根据流程进行安装&#xff0c; 其中所设定的内存和磁盘大小&#xff0c;可根据需求来进行设置。 需要注意的是&#xff1a; 所定义的磁盘大小&#xff0c; 不会直接…

Java系列之:字符串的截取及分割 split() 和 substring()

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 1、字符串的截取 split() 1.1 使用说明 1.…

群晖7.2版本安装Jellyfin

一、添加三方套件库 打开桌面【套件中心】&#xff0c;点击右上角的【设置】-【套件来源】-【新增】&#xff0c;添加矿神库 名称&#xff1a;我不是矿神 位置&#xff1a;https://spk7.imnks.com/ 二、安装Jellyfin 【套件中心】-搜索【Jellyfin】-【安装套件】 集显版群…

LoRaWAN通信协议物联网应用

LoRaWAN&#xff08;Long Range Wide Area Network&#xff0c;长距离广域网&#xff09;是由LoRa联盟推出的一种低功耗广域网标准&#xff0c;定义了网络的通讯协议和系统架构。该标准提供智能设备间的互联互通服务&#xff0c;无需复杂配置&#xff0c;便于用户、开 发者和企…

[Kettle] Excel输入

Excel文件采用表格的形式&#xff0c;数据显示直观&#xff0c;操作方便 Excel文件采用工作表存储数据&#xff0c;一个文件有多张不同名称的工作表&#xff0c;分别存放相同字段或不同字段的数据 数据源 物理成绩(Kettle数据集2).xls https://download.csdn.net/download/H…

SQL审计是什么意思?目的是什么?有什么好处?

很多刚入行的运维小伙伴对于SQL审计不是很了解&#xff0c;不知道其是什么意思&#xff1f;使用SQL审计的目的是什么&#xff1f;使用SQL审计的好处有哪些&#xff1f;这里我们大家就来一起聊聊&#xff0c;仅供参考哈&#xff01; SQL审计是什么意思&#xff1f; 【回答】&…

研发管理用什么软件?

研发管理用什么软件 研发管理用的软件有&#xff1a;1、JIRA&#xff1b;2、Confluence&#xff1b;3、彩虹PDM软件。彩虹PDM软件 是由南宁市二零二五科技有限公司 自主研发&#xff0c;为用户提供“产品全生命周期管理解决方案”。产品结构管理、BOD管理、零部件管理、工艺管理…

Go 定时任务实现

定时任务简介 定时任务是指按照预定的时间间隔或特定时间点自动执行的计划任务或操作。这些任务通常用于自动化重复性的工作&#xff0c;以减轻人工操作的负担&#xff0c;提高效率。在计算机编程和应用程序开发中&#xff0c;定时任务是一种常见的编程模式&#xff0c;用于周…

【Nginx篇】Nginx轻松上手

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

解决Docker启动之npm版本不兼容问题

报错内容&#xff1a; npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion1, but package-lock.json was generated for lockfileVersion2. Ill try to do my best with it! npm WARN tar ENOENT: no such file or directory, open /home/wvp-…

2023北京1024城市开发者聚会总结

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【LeetCode:2586. 统计范围内的元音字符串数 | 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

华为ICT——第六章:深度学习和卷积神经网络/详篇

目录 1&#xff1a;深度学习卷积的重要概念&#xff1a; 2&#xff1a;CNN核心思想——局部感知&#xff1a; CNN核心思想——参数共享&#xff1a; 3&#xff1a;卷积层的功能&#xff1a; 4&#xff1a;不同深度的卷积层提取的特征&#xff1a; 5&#xff1a;卷积效果——…

docker常用命令解析+Mysql基本操作和语法+Navicat的基本使用及常见报错

一、docker常用命令 1.查看docker容器的列表 语法&#xff1a;docker ps 2. 查看容器里的内容 语法&#xff1a;docker exec -it 容器名 容器内执行的命令 例子&#xff1a;docker exec -it mysql bash 含义&#xff1a;在mysql容器里&#xff0c;启动一个bash shell。 进…

【终端目标检测03】nanodet训练自己的数据集、NCNN部署到Android

nanodet训练自己的数据集、NCNN部署到Android 一、介绍二、训练自己的数据集1. 运行环境2. 数据集3. 配置文件4. 训练5. 训练可视化6. 测试 三、部署到android1. 使用官方权重文件部署1.1 下载权重文件1.2 使用Android Studio部署apk 2. 部署自己的模型【暂时存在问题】2.1 生成…

2023第一届OPENAIGC开发者大赛圆满收官获奖名单公示

11月4日&#xff0c;历时两个月的「2023第一届开放AIGC开发者大赛」在苏州国际博览中心圆满收官。本次大赛以“AI生成未来”为主题&#xff0c;旨在寻找并推动中国大模型、AIGC领域的创新人才和前沿技术应用。云集来自各大行业与领域的企业、高校等323支优秀团队&#xff0c;共…