关于使用Java-JWT的笔记

news2024/11/17 21:51:32

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,防重放攻击。

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

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

相关文章

java: 无效的目标发行版: 17 问题解决

今天在写完类点击运行后显示java: 无效的目标发行版: 17 网上查询了一番&#xff0c;发现有几个地方需要注意。 还有一个就是设置中&#xff0c;下面的就是我本次问题所在&#xff0c;不知道为什么&#xff0c;他自动添加了下面的东西 一个方法是把目标字节码版本改为正确的&a…

Linux:wget后台下载/查看后台任务进度

1. 后台下载 使用wget -b url&#xff1a; wget -b http://cn.wordpress.org/wordpress-3.1-zh_CN.zip后台任务启动后&#xff0c;会返回两段话&#xff0c;第一段返回一个pid&#xff0c;代表这个后台任务的进程&#xff0c;并且我们可以kill掉这个id来终止此次下载&#x…

听GPT 讲Rust源代码--src/librustdoc(2)

题图来自 Chromium项目将支持Rust编程语言[1] File: rust/src/librustdoc/html/render/search_index.rs 在Rust源代码中&#xff0c;rust/src/librustdoc/html/render/search_index.rs文件的作用是生成搜索索引&#xff0c;用于在Rust文档页面上进行关键字搜索。该文件实现了一…

C语言童年生活二三事(ZZULIOJ1091:童年生活二三事(多实例测试))

题目描述 Redraiment小时候走路喜欢蹦蹦跳跳&#xff0c;他最喜欢在楼梯上跳来跳去。 但年幼的他一次只能走上一阶或者一下子蹦上两阶。 现在一共有N阶台阶&#xff0c;请你计算一下Redraiment从第0阶到第N阶共有几种走法。 输入&#xff1a;输入包括多组数据。 每组数据包括一…

VMware——WindowServer2012R2环境安装mysql5.7.14解压版_互为主从(图解版)

目录 一、服务器信息二、192.168.132.35服务器上安装mysql&#xff08;主&#xff09;2.1、环境变量配置2.2、安装2.2.1、修改配置文件内容2.2.2、初始化mysql并指定超级用户密码2.2.3、安装mysql服务2.2.4、启动mysql服务2.2.5、登录用户管理及密码修改2.2.6、开启远程访问 三…

电力工作记录仪、智能安全帽、智能布控球助力智能电网建设

电力行业的建设和发展是国家经济发展的重要支撑&#xff0c;而智能电网作为电力系统的重要组成部分&#xff0c;它的安全高效运行关乎到整个电力系统乃至民生的稳定和安全。为了加快国家经济的发展以及满足人们对电力的需求和用电可靠性的要求&#xff0c;国家早在十二规划中就…

操作系统(三)| 进程管理上 进程状态 同步 互斥

目录 1 进程和程序区别 2 进程状态 2.1 进程的5种基本状态 2.2 进程状态之间转换 2.3 七状态模型 3 进程描述 3.1 进程控制块 PCB 3.2 进程块组织方式 4 进程控制 5 进程同步 互斥 5.1 区分进程互斥和同步 5.2 核心方案 5.3 其他方案 方案1 设置锁变量 方案2 严…

数据湖的概念、发展背景和价值

数据湖是一个集中化的存储系统&#xff0c;旨在以低成本、大容量的方式&#xff0c;无需预先对数据进行结构化处理&#xff0c;存储各种结构化和非结构化数据。以下是数据湖概念、发展背景和价值的详细介绍。 数据湖概念 数据湖的概念源自于对传统数据仓库的补充。传统数据仓…

AI大爆发的时代,未来的年轻人怎样获得机会和竞争力?

文章目录 引言AI与教育工作者教育资源不平衡 这次&#xff0c;狼真的来了。 引言 AI正迅猛地改变着我们的生活。 根据高盛发布的一份报告&#xff0c;AI有可能取代3亿个全职工作岗位&#xff0c;影响全球18%的工作岗位。在欧美&#xff0c;或许四分之一的工作可以用AI完成。另…

windows排除扫描文件夹

搜索防火墙和网络保护 点击病毒和威胁防护 往下拉&#xff0c;找到排除项 添加排除项

计算机毕业设计 基于SpringBoot的社区物资交易互助平台/系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【计算机网络学习之路】Windows下的socket编程

文章目录 前言Windows下的socket编程1.预备工作2. socket编程 结束语 前言 本系列文章是计算机网络学习的笔记&#xff0c;欢迎大佬们阅读&#xff0c;纠错&#xff0c;分享相关知识。希望可以与你共同进步。 本篇文章仅记录Windows下socket编程和Linux的不同&#xff0c;并没…

Lec15 Crash recovery

xv6文件系统实现分为七层&#xff0c;如图所示 File system logging&#xff08;文件系统日志&#xff09; 日志驻留在超级块中指定的已知固定位置。 它由一个头块&#xff08;header block&#xff09;和一系列更新块的副本&#xff08;logged block&#xff09;组成。头块…

关于Unity Time.deltaTime的理解和使用

Unity中的Time.deltaTime是一个表示上一帧到当前帧所用时间的浮点数。 它可以让Unity应用程序能够以平滑的方式在不同的帧率下运行。 要深刻理解Time.deltaTime&#xff0c;首先得了解Unity引擎得工作原理。 Unity引擎以每秒帧数&#xff08;FPS&#xff09;的形式运行。 比…

STM32:时钟树原理概要

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

python查找算法_顺序查找

顺序查找&#xff08;Sequential Search&#xff09;是一种简单直观的搜索算法&#xff0c;用于在无序数组中查找特定元素。它的基本思想是逐个遍历数组中的元素&#xff0c;直到找到目标元素或遍历完整个数组。本文将介绍顺序查找的基本原理&#xff0c;并通过Python代码进行详…

基于人工大猩猩部队算法优化概率神经网络PNN的分类预测 - 附代码

基于人工大猩猩部队算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工大猩猩部队算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工大猩猩部队优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&a…

硬盘录像机无法注册到视频监控平台EasyCVR上是什么原因?该如何解决?

视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff0c;也…

【剑指offer|图解|链表】链表的中间结点 + 链表中倒数第k个结点

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、算法模板 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️链表的中间结点二. ⛳️链表中倒数第k个结点&#x1f4dd;结语 &#x1f4c…

VPX 插座(VITA46)介绍及应用 (简单介绍)

1. VPX 插座的介绍 VPX是VITA(VME International Trade Association, VME国际贸易协会)组织于2007年在其VME总线基础上提出的新一代高速串行总线标准。VPX总线的基本规范、机械结构和总线信号等具体内容均在ANSI/VITA46系列技术规范中定义。VPX就是基于高速串行总线的新一代总线…