JWT快速入门及所需依赖

news2025/1/19 20:36:58

目录

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数据。

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

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

相关文章

计算机毕业设计django基于python大学生多媒体学习系统

项目介绍 随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的大学生多媒体学习系统的平台,这样可以有效地解决数据学习系统混乱的局面。 本文首先介绍了大学生多媒体学习系统的发…

eslint Parsing error: The keyword ‘export‘ is reserved

报错 原因 ECMAScript modules(import/export) 是 es6 的语法。 根据 eslint 官方文档 Configure language options &#xff0c;eslint 默认使用 es5 语法&#xff1a; 解决 要让 eslint 知道我在使用 es6 的 modules 语法。有下面几种方法&#xff1a; 设置 env 为 es6&am…

喜讯 | 第三届国际科创节,企企通喜提两项大奖

近日&#xff0c;第三届国际科创节暨数服会STIF奖评选活动重磅揭晓&#xff0c;旨在向科技创新与数字化转型引领者致敬。企企通作为作为数字化采购平台领军者&#xff0c;凭借业内领先的技术实力与优秀的服务口碑&#xff0c;经过层层筛选和专业评审&#xff0c;企企通最终荣膺…

【LeetCode每日一题:1785. 构成特定和需要添加的最少元素~~~数组公式推导+防止整型溢出+向上取整+贪心】

题目描述 给你一个整数数组 nums &#xff0c;和两个整数 limit 与 goal 。数组 nums 有一条重要属性&#xff1a;abs(nums[i]) < limit 。 返回使数组元素总和等于 goal 所需要向数组中添加的 最少元素数量 &#xff0c;添加元素 不应改变 数组中 abs(nums[i]) < limi…

内存管理:虚拟地址空间和堆

准备用一个系列来总结一下内存管理涉及到的相关知识&#xff0c;范围从底层的数据结构和算法&#xff0c;到上层的API的使用&#xff0c;这里的内存管理&#xff0c;目前打算主要是侧重在堆的管理&#xff0c;本文作为一个引子&#xff0c;先粗略讲一下虚拟地址空间、堆管理、a…

​合并PDF文件什么方法很简单?看完你就明白了

想要将几个PDF文件合并到一起&#xff0c;什么方法使用起来是很简单的呢&#xff1f;PDF文件作为大家经常使用的文件之一&#xff0c;对它的编辑需求也很多&#xff0c;除了需要编辑文件的内容之外&#xff0c;还有需要将几个文件合并到一起使用的需求。那么我们如果遇到这种情…

traffic-forward

traffic-forward traffic-forward 是一款python开发的流量转发工具&#xff0c;可以使用python脚本行运行&#xff0c;也可以封装使用命令行&#xff0c;同样可以使用pyinstaller等工具进行封装成Macos&#xff0c;Linux, Windows 下的可执行文件运行&#xff0c;可用于本地流量…

简单理解HTML区块_HTML学习第七篇区块元素和内联元素

简单理解HTML区块_区块元素和内联元素HTML篇_第七章、区块一、区块元素和内联元素1.1块级元素1.2内联元素二、<div>元素三、<span>元素HTML篇_第七章、区块 一、区块元素和内联元素 HTML元素可以通过<div>和<span>元素组合起来&#xff0c;大多数 HT…

固定行数的纵向分栏

【问题】 what can ı configure the jasper report detail heapriider layout ? ı want to print datas side by side and every sides have 4 datas sub bottom 1 data1 5 data5 2 data2 6 data6 3 data3 4 data4 【回答】 整张报表纵向分栏可在 jasper 中设置分栏数&a…

性能高、上手快,实体类转换工具 MapStruct 到底有多强大

1.什么是MapStruct 1.1 JavaBean 的困扰 对于代码中 JavaBean之间的转换&#xff0c; 一直是困扰我很久的事情。在开发的时候我看到业务代码之间有很多的 JavaBean 之间的相互转化&#xff0c; 非常的影响观感&#xff0c;却又不得不存在。我后来想的一个办法就是通过反射&…

用Quasar开发Vue3+Electron跨平台应用的简单指南

1. 前言 Quasar是一个开源的vue.js基础框架&#xff0c;简单配置即可在其基础上进行SPA, SSR, PWA, 手机网站以及跨平台应用程序的开发&#xff0c;本文将简述如何基于Quasar Vue3 Vite Electron进行桌面应用开发。 2. 配置流程 2.1 框架构建 首先&#xff0c;在要存放代…

『NLP学习笔记』NER任务的CRF-layer的原理

NER任务的CRF-layer的原理 文章目录一. 预备工作二. BILSTM-CRF模型2.1. BiLSTM层输出2.2. 如果没有CRF层会怎么样2.3. CRF层可以从训练数据中学到约束三. CRF层3.1. 发射(Emission)分数3.2. 转移(Transition)分数3.3. CRF损失函数3.4. 实际路径得分3.5. 所有可能的路径的得分…

Ac-EEVVAC-pNA,389868-12-6

Ac-EEVVAC-pNA, chromogenic substrate for a continuous spectrophotometric assay of HCV NS3 protease. The sequence EEVVAC is derived from the 5A-5B cleavage junction of the HCV polyprotein. Ac-EEVVAC-pNA, HCV NS3蛋白酶连续分光光度法测定的显色底物。EEVVAC序列…

FPGA驱动24C04实现读写操作,提供工程源码和技术支持

目录1.24c04芯片手册解读2.纯verilog的i2c驱动3.24c04读写状态机设计4.上板调试验证5.福利&#xff1a;工程源码获取1.24c04芯片手册解读 24c04芯片手册很简单&#xff0c;原理图设计页很简单&#xff0c;这里只说代码设计需要注意的点&#xff1a; 1、写操作延时周期大于等于…

嵌入式软件工程师技能树——Linux应用编程+网络编程+驱动开发+操作系统+计算机网络

文章目录Linux驱动开发1、Linux内核组成2、用户空间与内核的通讯方式有哪些&#xff1f;3、系统调用read/write流程4、内核态用户态的区别5、bootloader内核 根文件的关系6、BootLoader的作用7、BootLoader两个启动阶段1、汇编实现&#xff0c;完成依赖于CPU体系架构的设置&…

推荐系统学习笔记--推荐系统简介

由来 互联网的出现和普及给用户带来了大量的信息&#xff0c;满足了用户在信息时代对信息的需求&#xff0c;但随着网络的迅速发展而带来的网上信息量的大幅增长&#xff0c;使得用户在面对大量信息时无法从中获得对自己真正有用的那部分信息&#xff0c;对信息的使用效率反而…

前三季度净亏损8.01亿元,亿咖通海外上市背后的「吉利阴影」

中国智能汽车产业链供应商正在通过SPAC方式在海外上市&#xff0c;或将成为新一轮资本浪潮的焦点。这些企业大多数已经具备一定规模&#xff0c;但仍处于亏损状态。 11月21日&#xff0c;亿咖通&#xff08;ECARX Holdings, Inc.&#xff09;宣布&#xff0c;之前与COVA Acqui…

Windows Terminal 快速配置 oh-my-posh

背景 想美化下windows terminal &#xff0c;选择了oh-my-posh。网上的文章有点多&#xff0c;加上官方的教程对初次使用着并不是太友好&#xff0c;所以自己快速摸索了。记录下过程。 步骤 1&#xff0c;安装oh-my-posh 打开以下链接&#xff0c;安装oh-my-posh Windows …

一个进程只能最多创建2000个线程吗?

我经常听到有人说&#xff0c;为什么不能创建一个包含2000个线程的进程。 原因不是Windows中固有的任何特定限制。相反&#xff0c;程序员没有考虑每个线程使用的地址空间量。 线程由内核模式下的一些内存&#xff08;内核堆栈和对象管理&#xff09;和用户模式下的一些内存&…

互动抽奖背后的随机性与算法实现

背景抽奖&#xff0c;是一种典型的互动玩法形式。无论是大V的粉丝抽奖&#xff0c;还是活动会场的参与抽奖&#xff0c;这种起源于彩票开奖的互动玩法&#xff0c;同时兼顾了高期待感和低预期的特征&#xff0c;让活动在成本控制之余又能有惊喜和引爆点&#xff0c;这样的优势让…