当前位置: 首页 > news >正文

JWT的基础与使用

         JWTJSON Web Token 是一种用于在各方之间传输信息的紧凑、安全的方式,常用于身份验证和授权。它以令牌的形式将用户信息编码后传输,可以确保数据的完整性和安全性。

1.JWT的结构

         JWT 是一个基于 JSON 的令牌,由三部分组成,通过点号 (.) 分隔:

         header.payload.signature

         每部分都是经过 Base64Url 编码的字符串,分别对应以下三个部分:

1)Header(头部)

         头部包含令牌的元数据,通常包括令牌类型和签名算法。

         例子:

{

  "alg": "HS256",

  "typ": "JWT"

}

    alg: 签名使用的算法(如 HMAC SHA256)。

         typ: 声明令牌类型为 JWT。

2)Payload(有效载荷)

         有效载荷包含用户的声明(claims),也就是实际传输的数据。它通常包含身份验证或授权所需的信息。

{

  "sub": "1234567890",

  "name": "John Doe",

  "admin": true,

  "iat": 1516239022

}

常见的标准声明:

  • iss (issuer):签发者
  • sub (subject):面向的用户
  • aud (audience):接收的受众
  • exp (expiration):过期时间
  • iat (issued at):签发时间
  • nbf (not before):生效时间

自定义声明:可以根据需求添加任何信息。

3)Signature(签名)

    签名用于验证令牌的真实性,并确保令牌在传输过程中没有被篡改。

         签名的生成方式:

HMACSHA256(

  base64UrlEncode(header) + "." + base64UrlEncode(payload),

  secret

)

         签名使用头部中声明的算法和一个秘密密钥(secret key)生成。

2.JWT的工作流程

2.1.生成JWT

         用户登录后,服务器生成一个包含用户身份信息的 JWT,使用密钥对其进行签名。

2.2.客户端存储JWT

         生成的 JWT 会返回给客户端,客户端通常将其存储在浏览器的 localStoragesessionStorage 中,或者存储在 Cookie 中。

2.3.客户端请求时携带JWT

         在后续的请求中,客户端将 JWT 附加在请求头的 Authorization 字段中:

Authorization: Bearer <token>

2.4.服务器验证JWT

         服务器接收到 JWT 后,会使用相同的密钥对签名进行验证,确保令牌的完整性和真实性。

         如果 JWT 有效,服务器允许访问资源;如果令牌无效或过期,返回 401 未授权状态。

3.JWT的优势

         1)无状态:JWT 是无状态的,所有信息都保存在令牌中,服务器不需要维护会话数据。

         2)跨域支持:由于 JWT 不依赖于特定的存储机制,适合跨域认证。

         3)紧凑性:JWT 的结构紧凑,便于在 URL、HTTP 请求头等地方传输。

         4)灵活性:JWT 可以包含任意声明,支持灵活的身份和权限管理。

4.JWT的使用场景

         1)身份认证:用户登录后生成 JWT,之后每次请求时验证 JWT 以实现认证。

         2)授权:通过 JWT 传递用户权限信息,确保用户只能访问被授权的资源。

         3)信息传递:JWT 可以安全地传输一些加密的信息。

5. JWT 的安全性注意事项

         签名算法:建议使用强大的签名算法(如 HS256RS256),避免使用不安全的算法。

         HTTPS:JWT 中可能包含敏感信息,传输时必须使用 HTTPS 来防止令牌被截获。

         令牌过期:为 JWT 设置合理的过期时间(exp 声明),防止长期有效的令牌被滥用。

         刷新令牌:使用短期有效的访问令牌和长期有效的刷新令牌(Refresh Token)机制,以便在访问令牌过期后请求新的令牌。

6.Java代码实现生成和验证JWT

6.1.添加Maven依赖

         如果你使用 Maven 构建项目,首先在 pom.xml 中添加 JJWT 库的依赖:

<dependency>

    <groupId>io.jsonwebtoken</groupId>

    <artifactId>jjwt-api</artifactId>

    <version>0.11.5</version>

</dependency>

<dependency>

    <groupId>io.jsonwebtoken</groupId>

    <artifactId>jjwt-impl</artifactId>

    <version>0.11.5</version>

    <scope>runtime</scope>

</dependency>

<dependency>

    <groupId>io.jsonwebtoken</groupId>

    <artifactId>jjwt-jackson</artifactId>

    <version>0.11.5</version>

</dependency>

6.2.生成和验证 JWT 的 Java 代码

package com.me.mengyu.auth.net.jwt;

import io.jsonwebtoken.Jwts;

import io.jsonwebtoken.SignatureAlgorithm;

import io.jsonwebtoken.Claims;

import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;

import java.util.Date;

public class JwtExample {

    // 生成一个密钥,用于签名

    private static final SecretKey SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    // 创建 JWT

    public static String createJwt(String subject) {

        // 设置 JWT 过期时间

        long expirationTime = 1000 * 60 * 60; // 1 小时

        return Jwts.builder()

                .setSubject(subject) // 设置主题(可以是用户ID等信息)

                .setIssuer("your-app") // 设置发行者

                .setIssuedAt(new Date()) // 设置签发时间

                .setExpiration(new Date(System.currentTimeMillis() + expirationTime)) // 设置过期时间

                .signWith(SECRET_KEY) // 使用密钥签名

                .compact(); // 生成 JWT

    }

    // 验证 JWT 并提取信息

    public static void validateJwt(String token) {

        try {

            // 解析 JWT

            Claims claims = Jwts.parserBuilder()

                    .setSigningKey(SECRET_KEY) // 设置密钥

                    .build()

                    .parseClaimsJws(token) // 验证令牌

                    .getBody();

            // 输出从 JWT 中提取的信息

            System.out.println("Subject: " + claims.getSubject());

            System.out.println("Issuer: " + claims.getIssuer());

            System.out.println("Expiration: " + claims.getExpiration());

        } catch (Exception e) {

            System.out.println("Invalid JWT token: " + e.getMessage());

        }

    }

    public static void main(String[] args) {

        // 创建 JWT

        String jwt = createJwt("1234567890"); // 这里的主题可以是用户的ID

        System.out.println("Generated JWT: " + jwt);

        // 验证 JWT

        validateJwt(jwt);

    }

}

代码说明:

         1)createJwt 方法:生成一个带有签名的 JWT,包含用户身份信息(subject),签发者(issuer),签发时间和过期时间。使用 HS256 算法和一个密钥签名。

         2) validateJwt 方法:验证 JWT 是否有效,并从中提取 claims 信息(如 subjectissuerexpiration)。如果令牌无效(例如过期或签名不匹配),会抛出异常。

运行结果示例:

Generated JWT: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaXNzIjoieW91ci1hcHAiLCJpYXQiOjE3MjcwMTcyNDYsImV4cCI6MTcyNzAyMDg0Nn0.tNylO-O5Jbazd0QzR85X8OB7p1mDy0IGtyl97Ro0FYQ

Subject: 1234567890

Issuer: your-app

Expiration: Mon Sep 23 00:00:46 CST 2024

说明:

         生成的 JWT:格式为 header.payload.signature,其中 payload 包含 sub(用户ID)、iss(发行者)等信息。

         验证:输出 SubjectIssuerExpiration,表明 JWT 验证成功并解析出了信息。

6.3.注意事项

         1)密钥管理:在生产环境中,应该安全地管理密钥,避免泄露。

         2)过期时间:务必设置合理的过期时间,防止长时间有效的令牌带来安全风险。

         3)异常处理:应当详细处理验证失败的情况,比如过期令牌、签名错误等。

相关文章:

JWT的基础与使用

JWT&#xff08;JSON Web Token&#xff09; 是一种用于在各方之间传输信息的紧凑、安全的方式&#xff0c;常用于身份验证和授权。它以令牌的形式将用户信息编码后传输&#xff0c;可以确保数据的完整性和安全性。 1.JWT的结构 JWT 是一个基于 JSON 的令牌&#xff0c;由三部…...

处理 VA02修改行项目计划行(SCHEDULE LINES )报错:不可能确定一个消耗帐户

用户修改销售订单行项目 计划行(SCHEDULE LINES) &#xff0c;从 “CN”改为“CB”时候发生报错提示&#xff1a;不可能确定一个消耗帐户。 Not possible to determine a consumption account Message No. 06138 Diagnosis The system was not able to determine a consumpti…...

【AI基础】pytorch lightning 基础学习

传统pytorch工作流是首先定义模型框架&#xff0c;然后写训练和验证&#xff0c;测试循环代码。训练&#xff0c;验证&#xff0c;测试代码写起来比较繁琐。这里介绍使用pytorch lightning 部署模型&#xff0c;加速模型训练和验证&#xff0c;记录。 准备工作 1 安装pytorch…...

高通量测序技术--组蛋白甲基化修饰、DNA亲和纯化测序,教授(优青)团队指导:从实验设计、结果分析到SCI论文辅助

组蛋白甲基化修饰工具(H3K4me3 ChIP-seq)组蛋白甲基化类型也有很多种&#xff0c;包括赖氨酸甲基化位点H3K4、H3K9、H3K27、H3K36、H3K79和H4K20等。组蛋白H3第4位赖氨酸的甲基化修饰(H3K4)在进化上高度保守&#xff0c;是被研究最多的组蛋白修饰之一。 DNA亲和纯化测序 DNA亲…...

[极客大挑战 2019]RCE ME1

<?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]/",$code)){die("NO.");}eval($code); } else{highlight_file(__FILE__); }// ?>…...

计算机毕业设计 中医院问诊系统的设计与实现 Java实战项目 附源码+文档+视频讲解

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

FME辅助规划选址

1.需求&#xff1a;新建运动场馆 用地需求&#xff1a;至少1km*2km 找到符合要求的储备地块 2.已有资源&#xff1a;储备用地 现在城市地块储备比较充足&#xff0c;但都是不规则地块 找出可以建大型场馆的地块 3.问题分析 图斑内部可以放下1000*2000的矩形 4.解决思路…...

Unity中的GUIStyle错误:SerializedObject of SerializedProperty has been Disposed.

一运行就循环打印这个报错&#xff0c; 解决办法&#xff0c;每次改参数之后在HIerarchy中手动保存&#xff0c;就会停止循环打印&#xff0c;style中的字体也显示出来了&#xff0c; 或者 直接换个低版本的...

实战篇 | WSL迁移Linux系统到非系统盘(完整实操版)

1. 操作步骤 1.1 确认要导出的Linux系统是否存在&#xff08;可跳过&#xff09; # 终端命令 # 查看通过WSL安装的Linux系统列表 wsl -l1.2 导出Linux系统为tar包 # 终端命令 # 格式&#xff08;过&#xff09; wsl --export <Distribution Name> <File Name> #…...

增量式编码器实现原理

目录 概述 1 认识增量式编码器 1.1 概述 1.2 增量式编码器的特性 1.3 编码器的硬件 2 增量式编码器实现原理 2.1 编码器信号 2.2 正反转判断 概述 本文主要介绍增量式编码器实现原理&#xff0c;包括增量式编码器的特性&#xff0c;信号特性&#xff0c;以及如何使用编…...

数据集-目标检测系列-口罩检测数据集 mask>> DataBall

数据集-目标检测系列-口罩检测数据集 mask>> DataBall 数据集-目标检测系列-口罩检测数据集 mask 数据量&#xff1a;1W DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;享有百种数据集&#xff0c;持续增加中。 数据项目地址&#xff1a; gitcode: https…...

工作安排 - 华为OD统一考试(E卷)

2024华为OD机试(C卷+D卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时长(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和。那么请你帮小明安排一下工作,保证小明在指定…...

STM32 GPIO - 笔记

1 STM32的GPIO是漏还是源 在 STM32 微控制器中,GPIO(通用输入/输出)引脚既可以配置为漏极开路输出(Open-Drain)模式,也可以配置为推挽输出(Push-Pull)模式。因此,GPIO 引脚既可以作为“漏”(吸电流,Open-Drain),也可以作为“源”(供电流,Push-Pull)来使用。 GP…...

三篇文章速通JavaSE到SpringBoot框架 (中) IO 进程线程 网络编程 XML MySQL JDBC相关概念与演示代码

文章目录 IOfile类的作用I/O的作用将上篇文章综合项目使用IO流升级所需知识点 进程 线程创建线程的三种方式 网络编程网络编程介绍IP地址端口号网络通信协议网络通信协议的分层演示代码 XMLXML的作用是什么&#xff1f;xml特点 注解什么是注解&#xff1f;注解的使用注解的重要…...

Linux下的基本指令/命令(二)

热键 Tab&#xff1a; 连点两次 对命令进补齐 或者 显式 以目前所需字母 开头的指令。 也可以进行路径补齐 或者 显示所写的文件所处路径上的所有文件。 如果什么也没写&#xff0c;直接按Tab会显示所有命令 Ctrl C&#xff1a; 一旦出现失控的状态&#xff0c;或者任何无法…...

CentOs-Stream-9 设置静态IP外网访问

CentOs-Stream-9 设置静态IP&#xff0c;实现外网访问。这里面有些需要注意的地方&#xff0c;比如IP网段跟我们的宿主机不一样&#xff0c;需要查看具体的网络适配器网段&#xff0c;这样可以快速实现网络互通&#xff1b;另外它的网络配置文件也是不一样的。网络适配器对应的…...

精密制造的革新:光谱共焦传感器与工业视觉相机的融合

在现代精密制造领域&#xff0c;对微小尺寸、高精度产品的检测需求日益迫切。光谱共焦传感器凭借其非接触、高精度测量特性脱颖而出&#xff0c;而工业视觉相机则以其高分辨率、实时成像能力著称。两者的融合&#xff0c;不仅解决了传统检测方式在微米级别测量上的局限&#xf…...

边缘计算与 Python Web 应用:从理论到实践

边缘计算与 Python Web 应用&#xff1a;从理论到实践 目录 &#x1f310; 边缘计算基础 1.1 边缘计算的概念与云计算的区别1.2 边缘计算在物联网&#xff08;IoT&#xff09;与实时应用中的作用 &#x1f5a5;️ Python 在边缘设备上的部署 2.1 在 Raspberry Pi、Jetson Nan…...

华为OD机试真题------分糖果

题目描述&#xff1a; 小明从糖果盒中随意抓一把糖果&#xff0c;每次小明会取出一半的糖果分给同学们。当糖果不能平均分配时&#xff0c;小明可以选择从糖果盒中&#xff08;假设盒中糖果足够&#xff09;取出一个糖果或放回一个糖果。小明最少需要多少次&#xff08;取出、放…...

Kotlin:变量声明,null安全,条件语句,函数,类与对象

目录 一&#xff0c;变量声明 1.1 var和val 1.2 类型推断 1.3 Null安全 1.3.1 处理可为null性 二&#xff0c;条件语句 2.1条件语句与条件表达式 2.2 智能类型转换 三&#xff0c;函数 3.1 简化函数声明 3.2 匿名函数 3.3 高阶函数 四&#xff0c;类与对象 4.1 构…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…...