JWT快速入门及所需依赖

2023-11-17

目录

1.JWT

1.1什么是JWT

1.2JWT的构成

jwt的头部

payload

signature

1.3JWT快速入门案例

2Jwt认证(微服务)

2.1微服务下统一权限认证

 2.2应用认证

3.无状态的JWT令牌如何实现续签功能?

3.1不允许改变Token令牌实现续签

3.2允许改变Token令牌实现续签


参照:jwt三个组成部分_jwt加密算法 - 腾讯云开发者社区-腾讯云 (tencent.com)

1.JWT

在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用Json Web Token认证机制。

1.1什么是JWT

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

1.2JWT的构成

第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证。

jwt的头部

  • 声明类型,这里是JWT
  • 声明加密的算法 通常直接使用 HMAC SHA256 HS256

payload

载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分

公共的声明 : 公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.

私有的声明 : 私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

signature

JWT的第三部分是一个签证信息,这个签证信息由三部分组成:

header (base64后的)

payload (base64后的)

secret

  • 标准中注册的声明
  • 公共的声明
  • 私有的声明
  • 标准中注册的声明 (建议但不强制使用) :
  • iss: jwt签发者
  • sub: jwt所面向的用户
  • aud: 接收jwt的一方
  • exp: jwt的过期时间,这个过期时间必须要大于签发时间
  • nbf: 定义在什么时间之前,该jwt都是不可用的.
  • iat: jwt的签发时间
  • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

1.3JWT快速入门案例

所需依赖


  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.9.1</version>
    </dependency>
    <dependency>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
      <version>2.3.0</version>
    </dependency>
    <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-impl</artifactId>
      <version>2.3.0</version>
    </dependency>
    <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-core</artifactId>
      <version>2.3.0</version>
    </dependency>
    <dependency>
      <groupId>javax.activation</groupId>
      <artifactId>activation</artifactId>
      <version>1.1.1</version>
    </dependency>
  </dependencies>

代码

package com.hzw.jwt;

import io.jsonwebtoken.*;
import org.junit.Test;

import java.util.Date;
import java.util.UUID;

public class JwtTest {
    private long time=1000*60*60*2;
    private String signature="admin"; //签名

    //加密
    @Test
    public void jwt(){
        JwtBuilder jwtBuilder = Jwts.builder();
        //jwt 由header playload sign 组成
        String jwtToken=jwtBuilder
                //header
                .setHeaderParam("typ","JWT")
                .setHeaderParam("alg","HS256")
                //payload 载荷
                .claim("username","hzw")
                .claim("role","admin")
                .setSubject("admin-test")
                .setExpiration(new Date(System.currentTimeMillis()+time))
                .setId(UUID.randomUUID().toString())
                //signature 签名
               .signWith(SignatureAlgorithm.HS256,signature)
                //将三部分连接起来
                .compact();
        System.out.println(jwtToken);
    }
    //解密
    @Test
    public void parse(){
        String token ="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Imh6dyIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NzExMjAxOTEsImp0aSI6ImQxMGYwNjIwLThjM2ItNGIyMC1iYzUwLTE4YzE5OTIxNjM0MyJ9.wFQzUPi4t-5DJBxbuZksEHy2rm60ZWjl5FtMMUAEEzI";
        JwtParser parser = Jwts.parser();
        //
        Jws<Claims> claimsJws = parser.setSigningKey(signature).parseClaimsJws(token);
        //get
        Claims claims = claimsJws.getBody();
        Object username = claims.get("username");
        System.out.println(username);
        System.out.println(claims.get("role"));
        System.out.println(claims.getId());
        System.out.println(claims.getSubject());
        System.out.println(claims.getExpiration());
    }
}

2Jwt认证(微服务)

JWT是一个经过加密的,包含用户信息的且具有时效性的固定格式字符串

2.1微服务下统一权限认证

 2.2应用认证

验签注解实现

@GetMapping("/xxx")
自定义注解,利用AOP做验签
@CheckJwt
public void xxx(){
/Controller代码

两个方案对比

方案一:JWT校验无感知,验签过程无侵入,
执行效率低,适用于低并发企业级应用
方案二:控制更加灵活,有一定代码侵入,代
码可以灵活控制,适用于追求性能互联网应用

3.无状态的JWT令牌如何实现续签功能?

那JWT不设置过期时间行不行?
不行,会留下”太空垃圾”,后患无穷JWT不建议设置长时有效期
续签JWT必须有退出机制(设置过期时间)

3.1不允许改变Token令牌实现续签

加入redis。超过过期时间,自动删除K。注销删除K.

为什么加入Redis后JWT中过期时间可以去掉?
因为过期时间的被放到后端Redis存储,可以灵活控制
同时在生成MD5时加入环境特征,尽量避免人为盗取
但这也意味着JWT是有状态的,但也是我思考后唯一不改变前
端JWT的续签方案了

3.2允许改变Token令牌实现续签

情况1access_token、refresh_token未过期

情况2access_token过期,refresh_token未过期

生成全新token替换原有token,实现续签

问:为什么必须要两个jwt?为什么不直接设置token一个小时过期,判断还
有10分钟过期的时候,生成新的token进行替换?
答:这两个token的职责不一样:
access token用于业务系统交互,是最核心的数据。
refresh token只用于向认证中心获取新的access token与refresh_token.
refresh token的出现本质解决了在用户超过30分钟后,access token已经失效,
此时access token被送给认证中心是无法解析的,而refresh token因为生存时
间更长,且主体内容与access_token一致,因此被送达认证中心后可以被正确解
析,进而重新生成新的access._token与refresh_token。

情况三:access_token过期,refresh_token过期

清除两个JWT,重新登录

多线程:造成重复生成JWT问题

·认证中心设计一个计时Map数据结构
·只记录过去n秒内的原始jwt刷新所生成新jwt数据
·几秒内如果发现同样的jwt在再次请求刷新,就返回相同的新jwt数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JWT快速入门及所需依赖 的相关文章

  • 无法从 java 发送 48681 字节消息以保护 wcf 服务

    我必须使用相互身份验证从 java 调用安全的 WCF 服务 一切工作正常 除了我无法发送大小超过 48680 字节的消息 因此 48680 字节的消息已成功发送 但 48681 字节的消息未成功发送 并且 java 应用程序因读取超时异常
  • 如何正确地将MapStruct与Eclipse集成? (包括Lombok java代理)

    我愿意在一些官方项目中使用MapStruct 所以我决定先对其进行一些测试 我需要让它与 eclipse 集成工作 并遵循 MapStruct 网站上提供的所有说明 但是 到目前为止还没有运气 有人成功实现了这种整合吗 如果是的话我可以缺少
  • 从插件设置 Maven 属性

    我在这里阅读了一些关于如何从 Maven 插件设置属性的问题 其中大多数讨论了应用程序的版本号 似乎没有简单的方法可以做到这一点 我发现的最佳解决方案是拥有一个从插件更新的 filter properties 文件 并由主 pom 文件使用
  • Jackson反序列化SNS消息错误MismatchedInputException

    我正在编写一个通过 SNS HTTP 请求处理来自 Amazon Simple Email Service 的回调的功能 我想将亚马逊提供的消息解析为本地对象结构 问题是 SNS 将 JSON 消息包装成字符串 并且 Jackson 无法解
  • 如何将 Struts 2 与 Velocity 和 Tiles 结合使用

    有人能够获得与 struts 2 一起使用的速度和图块吗 我在网上查找示例或教程时遇到一些问题 从我从邮件列表中收集到的信息来看 这似乎根本不可能 但邮件已经很旧了 https struts apache org docs tiles pl
  • Junit测试中LocalDateTime反序列化的问题

    我有问题LocalDateTime反序列化Junit测试 我有简单的REST API返回一些DTO目的 当我呼叫端点时 响应没有问题 它是正确的 然后我尝试编写单元测试 得到MvcResult并使用ObjectMapper将其转换为我的DT
  • 通过 Session.update 和 HibernateTemplate.merge 进行 Hibernate 更新的区别

    我看到了更新操作的类型 第一的 getHibernateTemplate execute new HibernateCallback public Object doInHibernate Session session session f
  • Java Sound可以用来控制系统音量吗?

    Java 声音优惠FloatControl各种声音线路功能的实例 以及MASTER GAIN http docs oracle com javase 7 docs api javax sound sampled FloatControl T
  • 如何从 Jackson 中的自定义解串器调用默认解串器

    我在杰克逊的自定义解串器有问题 我想访问默认序列化器来填充我要反序列化的对象 在填充之后 我将做一些自定义的事情 但首先我想使用默认的 Jackson 行为反序列化对象 这是我目前拥有的代码 public class UserEventDe
  • 抽象方法实现与抽象方法重写。这两个对于抽象类意味着相同吗?

    我几乎要采取Java SE 8 程序员我 exam 1Z0 808 我正在使用这个学习指南 https www selikoff net java oca 8 programmer i study guide https www selik
  • 使用 JWT Laravel 5 进行身份验证,无需密码

    我正在尝试学习 Laravel 我的目标是能够构建一个 RESTful API 不使用视图或刀片 仅使用 JSON 结果 稍后 AngularJS Web 应用程序和 Cordova 混合移动应用程序将使用此 api 经过一番研究 我倾向于
  • 膨胀类 android.support.v7.internal.widget.NativeActionModeAwareLayout 时出错

    如果您以前解决过这个问题 请有人帮助我 我正在尝试使用材料设计制作一些东西 以便应用程序可以运行到 API 10 的低版本 我的代码中没有任何错误 但我不断收到此错误 Android 日志猫 06 01 05 05 37 414 E And
  • 获取 n 元组中的所有 1-k 元组

    当 n 5 且 k 3 时 以下循环将执行此操作 List
  • 在所有方法调用上允许类型见证有什么意义?

    假设我们有两种方法 如下所示 public static
  • 公共领域有哪些替代方案?

    我正在用 java 编写一个游戏 正如问题标题建议的那样 我在类中使用公共字段 暂且 据我所知 公共领域很糟糕 我有一些理解其中的原因 但如果有人能澄清为什么你不应该使用它们 那将不胜感激 问题是 从我所看到的来看 这似乎是合乎逻辑的 是使
  • 字节流和字符流

    请解释一下什么是字节流和字符流 这些究竟意味着什么 Microsoft Word 文档是面向字节的还是面向字符的 Thanks 流是一种顺序访问文件的方式 字节流逐字节访问文件 字节流适用于任何类型的文件 但不太适合文本文件 例如 如果文件
  • Hibernate SET 元素 order-by 子句

    我想知道 我可以平静地接受以下事实 当 fetch select 时 您可以在映射文件中的 SET 元素上设置 order by 属性 但如果您在创建查询时获取所有内容 这样安全吗 我的意思是 他们将结果放入 HashSet 中 我不认为这
  • 在JAVA中将数据写入.txt文件?

    我想知道是否是在JAVA中将计算的数据写入文本文件 我的 JAVA 代码是一个基于 GUI 的 gpa 计算器 我只想添加一个 JButton 和 ActionListener 它将类名 GPA 点和计算出的 GPA 写入 txt 文件 这
  • 在大画布上滚动

    我需要一些帮助来了解滚动绘制到 Android 画布上的项目的基础知识 假设我想创建一个时间线 其中 0 处的时间是可视化的顶部 并且随着时间的增加 时间线继续呈现在上一个点下方 如果我想在 Android 上渲染它 我知道我可以通过重写
  • 有没有办法防止 Spring Boot 覆盖 bean?

    与春天的抽象可刷新应用程序上下文 http docs spring io spring docs current javadoc api org springframework context support AbstractRefresh

随机推荐

  • 无源波分和彩光模块_甘肃移动2020~2022年无源波分设备及光模块集采结果:迅特、绍兴中科中标...

    据CFOL从中国移动招标与采购网上了解 上周五 甘肃移动公开2020 2022年无源波分设备及光模块集采结果 该项目于10月份启动招标 历时1个月 集采产品分为无源波分设备及光模块两类 项目分为标包1及标包2 各标包3家企业中标 2家中标1
  • android监控view高度变化,Android-获取View宽高的时机

    前言 最近遇到一个bug 问题描述是这样的 启动页需要放置一张广告图 要使这张图在不变形的情况下 等比例缩放 宽度要占满屏幕宽 于是手动计算并设置ImageView需要的缩放比例来对图片进行缩放 该方法触发的时机引发了一些问题 privat
  • ReferenceError: XXX is not defined 错误及解决办法

    ReferenceError XXX is not defined 错误及解决办法 我这里报错是忘记了引入此方法所在的js文件 解决办法 引入所需的js文件 此错误 另外一种情况就是 jQuery引入先后顺序不对 要先引入jQuery文件
  • emmc学习

    1 介绍 1 1 简介 emmc embedded multi media card eMMC的一个明显优势是在封装中集成了一个控制器 它提供标准接口并管理闪存 使得手机厂商就能专注于产品开发的其它部分 并缩短向市场推出产品的时间 这些特点
  • pikachu之文件下载和文件上传

    目录 一 文件下载 1 复制这个下载文件地址 2 尝试去下载这个down nba php 3 目录扫描工具 二 文件上传 1 checkclient 1 利用burp suite 2 关闭js 3 修改页面源代码 2 mime类型验证 3
  • IO多路复用机制详解

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型 常见的IO模型有四种 1 同步阻塞IO Blocking IO 即传统的IO模型 2 同步非阻塞IO Non blocking IO 默认创建的socket都是阻塞的 非阻塞IO
  • 机器学习模型融合

    模型融合方式 均值法Averaging 适用于回归类算法 将每个评估器的输出做平均 类似于Bagging中回归的做法 投票法Voting 适用于分类算法 将每个评估器的输出进行投票 类似于Bagging中分类的做法 堆叠法Stacking
  • heapdump文件找相关的键值

    前言 一次做项目遇到heapdump文件 也是第一次碰到所以记录一下过程 步骤 下载heapdump文件是一个 hprof gz后缀的文件 使用MemoryAnalyzer这个工具就可以进行对其中的键值进行分析 工具的安装 下载好Memor
  • C++:主要的关联式容器类型:set

    目录 1 关联式容器 2 键值对 3 树形结构的关联式容器 4 set 5 set的特点 6 set的使用 常用接口的使用 1 insert 2 find 3 erase 4 operator 7 multiset 1 关联式容器 与vec
  • 解决pyqt中mainwindow界面最大化按钮是灰色(不能最大化)的问题

    解决方法 将maximumSize的值设置为16777215x16777215即可使窗口打开时最大化按钮可用 MAIN SIZE MAX QSize 16777215 16777215 self setMaximumSize MAIN SI
  • 系统服务器迁移,应用系统和服务器迁移云

    应用系统和服务器迁移云 内容精选 换一换 公有云通常指第三方供应商为用户提供的能够通过Internet使用的云端基础设施和服务 其核心属性是共享资源服务 华为云是公有云品牌 在SAP系统迁移的过程中 您可以单独使用这些华为云云服务 也可以组
  • Python方便又强大的日志记录器——loguru

    Python方便又强大的日志记录器 loguru Loguru是一个旨在使Python日志记录变得愉快的库 该库通过添加一系列有用的功能来解决标准记录器的警告 从而减少Python日志记录的痛苦 日志记录对每个应用程序都是基本的 它简化了调
  • rosserial_arduino

    rosserial arduino 一级目录 二级目录 三级目录 wiki tutorials 1 安装arduino IDE 2 Installing the Software 2 1 Installing on the ROS work
  • linux charg修改目录,Thinkpad在GUN/linux(ubuntu)下修改电池充电阈值

    详见 http www thinkwiki org wiki Tp smapi 安装tp smapi aptitude install tp smapi dkms modprobe tp smapi 更改充电阈值 设置开始充电阈值 如从 6
  • 02

    1 克隆镜像 前提 centos 7 选择 管理 gt 克隆 选择 下一步 选择 虚拟机中的当前状态 选择 创建完整克隆 设置 虚拟机名称 和 位置 克隆完成界面 2 导入镜像 打开虚拟机 选择对应的克隆文件 导入后的结果 3 网络设置 3
  • 铨顺宏RFID:根据UWB技术性的矿山开采人员精准定位系统

    计划方案环境及总体目标 伴随着智能技术的持续发展趋势 矿山开采生产模式不断创新 翠绿色 绿色生态 智能化慢慢变成煤业的追求完美 煤业智能化系统 智能化针对矿山开采而言十分关键 不但可以产生生产量的提升 还能够协助减少资金投入和产品成本 提高
  • 科技云报道:震惊!4K、8K画质背后,竟然少不了AI的助力

    科技云报道原创 对于视频的画质 我现在最低只能够接受720P 最好是1080p 早五年前 身边就已经有人提出了这样的要求 随着科技的进步 我们进入了一个视频内容快速增长的时代 从社交媒体到在线教育 从直播购物到虚拟会议 视频正逐渐成为主流的
  • Jiu Yuan Wants to Eat【2018焦作网络赛】【树链剖分】

    题目链接 树链剖分学习笔记 可以看这里 这道题还真挺好的 以前不会做 现在想了发现 学过树链剖分之后 剩下的部分就是处理去反那块比较的不容易些了 但是想了一下午 现在还是给我敲出来了 我们主要难处理的就是关于求反 那么怎么处理求反 一开始读
  • antd-select下拉框如何同时获取所选值ID和名字属性

    其中传过去的e为 从antd官网可以看到select组件的onchange属性传参 第一个参数为value 第二个参数可为所选中的那一项的所有信息 其中的props属性内有一个children属性 即存储了所选项的名称
  • JWT快速入门及所需依赖

    目录 1 JWT 1 1什么是JWT 1 2JWT的构成 jwt的头部 payload signature 1 3JWT快速入门案例 2Jwt认证 微服务 2 1微服务下统一权限认证 2 2应用认证 3 无状态的JWT令牌如何实现续签功能