关于使用Java-JWT的笔记

Token的组成规则

一个token分三部分,按顺序为:头部(header),载荷(payload),签证(signature) 由三部分生成token ,三部分之间用“.”号做分隔。

例如:“eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.MT8JrEvIB69bH5W9RUR2ap-H3e69fM7LEQCiZF-7FbI”。

  1. 头部:Jwt的头部承载两部分信息,声明类型(例如:typ=jwt)和 加密算法(例如 : alg=HS526)
  2. 载荷:载荷存放有效的信息,分为两种:① 标准中注册的声明的数据部分 ② 自定义数据部分。这两部分使用base64加密,然后存入到JWT的claim中 (使用withClaim(“key”:“value”))。

标准载荷:

iss: jwt签发者

sub: jwt所面向的用户

aud: 接收jwt的一方

exp: jwt的过期时间,这个过期时间必须要大于签发时间

nbf: 定义在什么时间之前,该jwt都是不可用的.

iat: jwt的签发时间

jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

自定义载荷:自定义载荷就是将自己需要的一些 key=>value数据放入到载荷中.

// 下面的 name=>zhangsan , role=>admin 就是自定义载荷数据
String token = JWT.create()
                .withIssuer("auth0")  // issuer 签发者
                .withExpiresAt(new Date(System.currentTimeMillis()+7200*1000)) // token过期时间 2H
                .withClaim("name","zhangsan") // 自定义存储的数据
                .withClaim("role","admin")
                .sign(Algorithm.HMAC256("secret")); // token加签加密
  1. 签证(计算过程):HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), signature) ,即需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加密钥secret组合加密,然后就构成了jwt的第三部分。

导入POM依赖

 <dependency>
     <groupId>com.auth0</groupId>
     <artifactId>java-jwt</artifactId>
     <version>4.4.0</version>
 </dependency>

生成token

我的这个例子就通过普通的maven项目来生成token,并不从web项目方面构建,但原理是一致的。

/**
 * 生成token
 * @return
 */
public static String genToken(){
    try {
        Algorithm algorithm = Algorithm.HMAC256("secret"); // 使用HMAC256加密算法
        String token = JWT.create()
                .withIssuer("auth0")  // issuer 签发者
                .withIssuedAt(new Date(System.currentTimeMillis()))
                .withExpiresAt(new Date(System.currentTimeMillis()+7200*1000)) // token过期时间 2H
                .withAudience("app") // 校验jwt的一方
                .withClaim("name","zhangsan") // 自定义存储的数据
                .withClaim("role","admin")
                .sign(algorithm); // token加签加密
        return token;
    } catch (JWTCreationException exception){
        return "";
    }
}

在生成token的方法中,设置了issuer签发者,签发时间,token过期时间,校验token方,以及一些自定义数据载荷,签证加密算法使用 HMAC256。

① 签发时间必须小于过期时间
② 签发时间和过期时间都是使用秒来计算
③ 载荷都可以通过 withClaim 方法来添加,同时JWT也提供了标准载荷的方法,功能是一样的

验证token

/**
 * 校验token是否正确
 * @param token
 * @return
 */
public static DecodedJWT verifyToken(String token){
    return  JWT.require(Algorithm.HMAC256("secret")).build().verify(token);
}

/**
 * 校验token,捕获异常并返回错误信息
 * @param token
 * @return
 */
public static String  checkToken(String token){
   try {
       verifyToken(token);
       return "token正确";
   }catch (SignatureVerificationException e){
       return "无效签名";
   }catch (TokenExpiredException e){
       return "token过期";
   }catch (AlgorithmMismatchException e){
       return "token算法不一致";
   }catch (Exception e){
       return "token无效";
   }
}

完整代码

package jwt_test;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.*;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;

/**
 * 使用 java-jwt 生成token 以及 token 验证
 */
public class JwtUtils {


    /*
    token: header(头部) + payload(载荷) + signature(签名)
    载荷就是存放有效信息的地方。基本上填2种类型数据
        -标准中注册的声明的数据
        -自定义数据
    (1) eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
    (2) eyJpc3MiOiJhdXRoMCJ9.
    (3) MT8JrEvIB69bH5W9RUR2ap-H3e69fM7LEQCiZF-7FbI
     */

    /**
     * 生成token
     * @return
     */
    public static String genToken(){
        try {
            Algorithm algorithm = Algorithm.HMAC256("secret"); // 使用HMAC256加密算法
            String token = JWT.create()
                    .withIssuer("auth0")  // issuer 签发者
                    .withIssuedAt(new Date(System.currentTimeMillis()))
                    .withExpiresAt(new Date(System.currentTimeMillis()+7200*1000)) // token过期时间 2H
                    .withAudience("app") // 校验jwt的一方
                    .withClaim("name","zhangsan") // 自定义存储的数据
                    .withClaim("role","admin")
                    .sign(algorithm); // token加签加密
            return token;
        } catch (JWTCreationException exception){
            // Invalid Signing configuration / Couldn't convert Claims.
            return "";
        }
    }


    /**
     * 校验token,捕获异常并返回错误信息
     * @param token
     * @return
     */
    public static String  checkToken(String token){
       try {
           verifyToken(token);
           return "token正确";
       }catch (SignatureVerificationException e){
           return "无效签名";
       }catch (TokenExpiredException e){
           return "token过期";
       }catch (AlgorithmMismatchException e){
           return "token算法不一致";
       }catch (Exception e){
           return "token无效";
       }
    }


    /**
     * 校验token是否正确
     * @param token
     * @return
     */
    public static DecodedJWT verifyToken(String token){
        return  JWT.require(Algorithm.HMAC256("secret")).build().verify(token);
    }

    public static void main(String[] args) {
        String token = genToken();
        System.out.println(token);
        String res = checkToken(token);
        System.out.println(res);
    }
}

Token解析测试

https://config.net.cn/tools/Jwt.html

在这里插入图片描述

[说明]
 iss: jwt签发者.    
 sub: jwt针对的用户
 aud: 校验jwt的一方
 exp: jwt的过期时间,过期时间需大于签发时间
 nbf: 定义在什么时间之前该jwt是不可用的.
 iat: jwt的签发时间
 jti: jwt的唯一身份标识,作一次性token,防重放攻击。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Android Jetpack】理解ViewModel

文章目录 ViewModel实现ViewModelViewModel的生命周期在Fragments间分享数据ViewModel和SavedInstanceState对比ViewModel原理ViewModel与AndroidViewModel ViewModel Android系统提供控件&#xff0c;比如Activity和Fragment&#xff0c;这些控件都是具有生命周期方法&#x…

对象中扩展运算符的作用

1.对象的合并 let o1 {name: "张三",age: 18,brother: {name: "李四",age: 19,},};//属性不重复let o2 {hobby: "打篮球",};console.log({ ...o1, ...o2 });//属性重复&#xff0c;后面对象的属性会覆盖前面的属性let o3 {name: "王五&q…

P2 C++变量

前言 一 C变量的作用 本期我们来讨论一下c 中的变量。 在一个 C 程序中&#xff0c;大部分内容实际上都是在使用数据。我们操作任何类型的数据&#xff0c;如包括我们想要改变、想要修改&#xff0c; 想要读和写数据。我们都需要把数据存储进叫做变量的东西里面。变量允许我们…

Github搜索技巧

文章目录 1 普通搜索2 高级搜索技巧3 github advance查找工具 1 普通搜索 我们一般在github搜索项目&#xff0c;都是直接在根据仓库关键字搜索项目&#xff0c;可能还会用到图中的匹配条件进行筛选。 这样虽然能实现我们的大部分需求&#xff0c;但还不足实现精确查找。而git…

SpringCloud实用篇02

SpringCloud实用篇02 0.学习目标 1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我…

卷积神经网络(ResNet-50)鸟类识别

文章目录 卷积神经网络&#xff08;CNN&#xff09;mnist手写数字分类识别的实现卷积神经网络&#xff08;CNN&#xff09;多种图片分类的实现卷积神经网络&#xff08;CNN&#xff09;衣服图像分类的实现卷积神经网络&#xff08;CNN&#xff09;鲜花的识别卷积神经网络&#…

提升--09-1--AQS底层逻辑实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、怎么解释AQS是什么&#xff1f;AQS的本质是JUC包下一个抽象类&#xff0c;AbstractQueuedSynchronizer &#xff08;抽象的队列式同步器&#xff09; 二、AQS核…

Flowable工作流高级篇

文章目录 一、任务分配和流程变量1.任务分配1.1 固定分配1.2 表达式分配1.2.1 值表达式1.2.2 方法表达式 1.3 监听器分配 2.流程变量2.1 全局变量2.2 局部变量2.3 案例讲解 二、候选人和候选人组1.候选人1.1 定义流程图1.2 部署和启动流程实例1.3 任务的查询1.4 任务的拾取1.5 …

STM32:时钟树原理概要

在一般情况下只要在CubeIDE中将RCC下的高速时钟源设置成晶振&#xff0c;随后在时钟配置中把HCLK设置到最大频率&#xff08;比如STM32F103的最高频率是72MHZ &#xff09;&#xff0c;CubeIDE就会帮我们自动调节其它参数到合适的值。这样我们芯片就可以全速运行了。 一、时钟信…

【20年扬大真题】设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保障该表的有序性。

【20年扬大真题】 设顺序表va中的数据元素递增有序。 试写一算法&#xff0c;将x插入到顺序表的适当位置上&#xff0c;以保障该表的有序性。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<malloc.h> #define MaxSize 9//定义最大长度 int InitAr…

俄罗斯网络间谍组织在有针对性的攻击中部署LitterDrifter USB蠕虫

导语 俄罗斯网络间谍组织最近在针对乌克兰实体的攻击中&#xff0c;部署了一种名为LitterDrifter的USB蠕虫。这种蠕虫具有自动传播恶意软件的功能&#xff0c;并与威胁行为者的命令和控制服务器进行通信。该组织被称为Gamaredon&#xff0c;其攻击行动被认为是大规模的&#xf…

探寻欧洲市场的机遇:深度剖析欧洲跨境电商

随着全球化的不断推进&#xff0c;欧洲作为一个经济发达、多元文化共存的大陆&#xff0c;成为跨境电商发展的重要目标。本文将深入剖析欧洲跨境电商的机遇&#xff0c;分析欧洲市场的特点、挑战与前景&#xff0c;为企业提供在这个充满潜力的市场中蓬勃发展的指导。 欧洲市场的…

ArcGIS教程——ArcGIS工具-按线分割面

功能说明 在ArcGIS数据处理过程中&#xff0c;有时需要沿线把面要素分割开&#xff0c;可以使用高级编辑中的分割面&#xff08;Cut Polygon&#xff09;工具。那么&#xff0c;如果要用线图层分割面图层该怎么办呢&#xff1f;地理遥感生态网平台开发了一个自定义模型工具。它…

【cpolar】TortoiseSVN如何安装并实现公网提交文件到本地SVN服务器

&#x1f3a5; 个人主页&#xff1a;深鱼~ &#x1f525;收录专栏&#xff1a;cpolar &#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控…

MySQL InnoDB 引擎底层解析(三)

6.3.3. InnoDB 的内存结构总结 InnoDB 的内存结构和磁盘存储结构图总结如下&#xff1a; 其中的 Insert/Change Buffer 主要是用于对二级索引的写入优化&#xff0c;Undo 空间则是 undo 日志一般放在系统表空间&#xff0c;但是通过参数配置后&#xff0c;也可以用独立表空 间…

初识linux(1)

文章目录 什么是linux什么是操作系统&#xff1f;开源 怎么装linux的环境基础指令lspwdcdtouchmkdirrmdir与rmmancpmv 什么是linux linux是一款开源操作系统 什么是操作系统&#xff1f; 操作系统&#xff1a;一种对计算机所有计算机软硬件进行控制和管理的系统软件 开源 开源&…

2023年中国AI基础设施行业发展趋势分析:AI基础设施将保持高速增长[图]

从产品形态来看&#xff0c;AI基础设施可划分为AI基础硬件和基础软件两大类。而在AI生态系统中&#xff0c;通用型和定制型AI基础设施的相互依赖性促进了广泛的AI技术应用&#xff0c;也为各行业的持续发展提供了关键支持。 AI基础设施分类 资料来源&#xff1a;共研产业咨询&…

一文详解!SRM(供应商管理)助力实现采购端实现降本增效

供应商管理关系到企业各部门的正常运转&#xff0c;一个好的SRM供应商管理系统对于公司来说无疑是锦上添花&#xff0c;改善企业与供应商的关系&#xff0c;可以帮助企业实现采购端的降本增效。但在信息化转型的浪潮下&#xff0c;很多企业SRM信息化却遇到不少问题。 那么请花…

云计算:开辟数字时代的无限可能

云计算是一项革命性的技术&#xff0c;为企业和个人提供了灵活、可扩展和高效的计算资源。本文将介绍云计算的概念、架构和优势&#xff0c;并探讨其在数字化时代的重要性和未来发展趋势。 引言 随着信息技术的日新月异和数字化转型的浪潮席卷全球&#xff0c;云计算作为一种颠…

分布式系统的认证授权

一.分布式系统的认证授权大致架构 以云音乐系统为例&#xff1a; 注&#xff1a;一般情况下&#xff0c;我们会把认证的部分的接口提取为一个单独的认证服务模块中。 二.单点登录&#xff08;Single Sign On&#xff09; 单点登录&#xff0c;Single Sign On&#xff0c;简称…