JWT快速入门及所需依赖

这篇具有很好参考价值的文章主要介绍了JWT快速入门及所需依赖。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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微服务下统一权限认证

JWT快速入门及所需依赖

 2.2应用认证

JWT快速入门及所需依赖

验签注解实现

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

两个方案对比

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

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

JWT快速入门及所需依赖

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

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

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

JWT快速入门及所需依赖

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

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

情况1access_token、refresh_token未过期

JWT快速入门及所需依赖

情况2access_token过期,refresh_token未过期

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

JWT快速入门及所需依赖

问:为什么必须要两个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数据。文章来源地址https://www.toymoban.com/news/detail-431186.html

到了这里,关于JWT快速入门及所需依赖的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java简单快速入门JWT(token生成与验证)

            简单来说,token就是一个将信息加密之后的密文,而jwt也是token的实现方式之一,用于服务器端进行身份验证和授权访问控制。由于是快速入门,这里简单介绍一下jwt的生成原理         jwt由三部分组成。分别是                 1.Header(标头),一般用于指明toke

    2024年02月04日
    浏览(67)
  • maven导入无法拉取所需依赖

    公司使用的是gradle,配置的私有云,maven里面配置私有云完全使用不了,无论配置国内还是国外的,导入的项目报错拉不到jar包。 完全不生效,不清楚为什么。 舍弃私有云,由于公司是使用的脚本代理上网,根据不同的域名IP解析配置不同的代理,通过脚本找到几个能用的

    2024年01月17日
    浏览(28)
  • 快速入门使用spring详细步骤(介绍、导入依赖、第一个简单程序)

    目录 一、spring介绍 二、spring使用步骤 (一)创建maven项目  (二) maven项目导入spring依赖 (三)开始编写第一个spring程序 三、新篇章之springboot(额外篇) spring是作为Java EE企业级开发很好的一个框架,这篇文章就来讲解一下怎么使用spring。要使用spring,现在一般都是 使用

    2024年02月04日
    浏览(42)
  • windows 搭建docker 以及部署前后端项目及程序,对所需目录挂载nginx进行配置显示

    1.我们在电脑上进行搜索 ,启用或者关闭windows功能 2. 如果没有 Hype-V的话,具体添加步骤如下: 在本地创建一个.bat文件,内容为:  保存为.bat文件,然后右键,以管理员身份运行。 等待安装好之后,最后一步点击Y。完成安装。 然后以管理员身份运行powershell.这个其实就是

    2024年02月08日
    浏览(31)
  • Pyinstaller 快速找出所需库的方法

    目录 【auto-py-to-exe】第三方库 使用【auto-py-to-exe】逐步尝试         1.什么文件都不添加,选择项目与单目录后直接打包         2.直接运行生成的exe文件          3.定位所需的包         4.--add-data 和  --hidden-import 打包为一个exe文件          其是pyinstaller操作

    2024年02月08日
    浏览(32)
  • 64位Linux系统上安装64位Oracle10gR2及Oracle11g所需的依赖包

    在64位Linux系统上安装64位Oracle 10gR2,到底需要装哪些包?  这不是一个完整的安装教程 , 仅仅探讨在 64 位 CentOS 5.8 系统上安装 64 位 Oracle 10gR2, 到底需要装哪些 RPM 包 . 实验环境 VMWare Workstation 8.0 Linux 发行版 : CentOS 5.8 x86_64 Kernel 版本 : 2.6.18-308.el5 Oracle Database 版本 : 10201_database_l

    2024年02月09日
    浏览(34)
  • 搜索引擎爬虫技巧:快速获取所需信息!

    现代社会,信息爆炸式增长,各行各业都需要大量的数据支持。而搜索引擎则成为了人们获取信息的主要途径。但是,人工搜索对于海量数据的处理速度和效率都无法满足需求。这时候,基于搜索引擎爬取资源就成为了一种重要的方式。本文将从多个方面详细介绍如何利用爬

    2024年02月05日
    浏览(37)
  • 1.2 什么是运维

    运维(Operations and Maintenance,简称OM)是指对于计算机系统、网络设备、软件应用等信息技术基础设施的运行和维护工作。它涵盖了硬件、软件、网络和数据等方面的管理和支持,旨在确保系统的稳定运行、高效性能和安全性。 运维团队负责管理和维护企业的信息技术基础设

    2024年02月15日
    浏览(25)
  • 什么是SVG?——SVG快速入门

    最近在学习一个前端数据可视化D3.js,它的图表绘制是基于SVG的,作为一个小菜鸡,我并不知道什么是SVG,于是我决定把D3.js放一放,先学一下SVG。 那么什么是SVG呢?百度百科上是这么介绍的:“SVG是一种图形文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢

    2024年02月16日
    浏览(36)
  • 如何用手机快速获得真人手办所需的人像模型

    伴随网络生活覆盖面的增大,越来越多的领域需要三维模型 ,比如最近爆火的真人手办就必须用到人像模型 。 真人手办的制作过程其实非常简单,在专门搭建的摄影棚内进行全身3D扫描,获得3D人体模型,然后进行修模,最后3D打印出来,一个真人手办就诞生了。 想快速做一

    2024年02月11日
    浏览(624)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包