热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析JWT的实现与应用

本文深入探讨了JSONWebToken(JWT)的实现机制及其应用场景。JWT是一种基于RFC7519标准的开放性认证协议,用于在各方之间安全地传输信息。文章详细分析了JWT的结构、生成和验证过程,并讨论了其在现代Web应用中的实际应用案例,为开发者提供了全面的理解和实践指导。

jwt的学习


1. jwt 是什么

什么是JSON Web令牌?JSON Web Token(JWT)是一种开放标准(RFC7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名

2. jwt 能干什么


  • 授权:这是使用JWT最常见的场景。用户登录后,每个后续请求都将包括JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是目前广泛使用JWT的一种功能,因为它的开销很小,并且能够轻松地跨不同的域使用。
  • 信息交换:JSON Web令牌是在各方之间安全传输信息的好方法。因为JWT可以签名,例如,使用公钥/私钥对,您可以确保发送者是他们所说的人。此外,由于签名是使用报头和有效载荷计算的,因此您还可以验证内容没有被篡改。

3. jwt的结构

jwt 由三部分组成, 通过 .分隔, 分别由以下三部分组成:


  • Header(头部)
  • Payload(有效载荷)
  • Signature(签名)

所以, 一个jwt结构通常是这样的:

xxxxxx.yyyyyy.zzzzz

​ 结构介绍 :


  1. Header

标头通常由两部分组成:令牌的类型(JWT)和正在使用的签名算法(如HMAC SHA256或RSA)。
例如:
{"alg": "HS256", "typ": "JWT"
}
这个JSON是Base64Url编码的,构成JWT的第一部分。

  1. Payload

令牌的第二部分是有效载荷,其中包含声明。声明是关于实体(通常是用户)和其他数据的声明。索赔有三种类型:登记索赔、公开索赔和私人索赔。
{"sub": "1234567890","name": "John Doe","admin": true
}
然后对有效负载进行Base64Url编码,形成JSON Web令牌的第二部分。

  1. Signature

要创建签名部分,您必须获取编码的报头、编码的有效负载、一个秘密、报头中指定的算法,并对其进行签名。
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

4. jwt的第一个程序

spring boot 中使用jwt

*** 使用步骤:***


1.pom 中加入jwt相关依赖

com.auth0java-jwt3.18.3

2. 生成token令牌

在test中创建一个测试类

@Test
public void contextLoads() {Map<String, Object> map &#61; new HashMap<>();Calendar calendar &#61; Calendar.getInstance();calendar.add(Calendar.MINUTE,10);String token &#61; JWT.create().withHeader(map) // Header.withClaim("username", "小三") // Payload.withClaim("userId", "4893210") //Payload.withExpiresAt(calendar.getTime())//令牌过期时间.sign(Algorithm.HMAC256("hahaha")); // Signature// "hahaha"为密钥System.out.println(token);}

运行测试&#xff0c;结果如: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwhv8rYU-1647054628015)(C:\Users\孙肖飞\AppData\Roaming\Typora\typora-user-images\image-20220312105444212.png)]


3. 验证token令牌

&#64;Testpublic void test01(){JWTVerifier jwtVerifier &#61; JWT.require(Algorithm.HMAC256("hahaha")).build();//使用相同的算法和相同的密钥DecodedJWT verify &#61; jwtVerifier.verify(String token);// token 为上步运行生成的tokenSystem.out.println(verify.getClaim("username"));System.out.println(verify.getClaim("userId"));}

运行测试&#xff0c;结果&#xff1a;
在这里插入图片描述


5. jwt封装


  1. private static final String signal &#61; "hahaha";//密钥/*** 生成token* &#64;param map* &#64;return*/public static String getToken(Map<String, String> map){String token &#61; null;JWTCreator.Builder builder &#61; JWT.create();//PayloadSet<String> stringSet &#61; map.keySet();for(String s : stringSet){builder.withClaim(s,map.get(s));}Calendar calendar &#61; Calendar.getInstance();calendar.add(Calendar.SECOND, 10);builder.withExpiresAt(calendar.getTime());//设置过期时间token &#61; builder.sign(Algorithm.HMAC256(signal));return token;}

  2. /*** 验证token*/public static void verifyToken(String token){JWTVerifier require &#61; JWT.require(Algorithm.HMAC256(signal)).build();require.verify(token);}


推荐阅读
  • 深入解析 iOS Objective-C 中的对象内存对齐规则及其优化策略
    深入解析 iOS Objective-C 中的对象内存对齐规则及其优化策略 ... [详细]
  • 深入解析Java中HashCode的功能与应用
    本文深入探讨了Java中HashCode的功能与应用。在Java中,HashCode主要用于提高哈希表(如HashMap、HashSet)的性能,通过快速定位对象存储位置,减少碰撞概率。文章详细解析了HashCode的生成机制及其在集合框架中的作用,帮助开发者更好地理解和优化代码。此外,还介绍了如何自定义HashCode方法以满足特定需求,并讨论了常见的实现误区和最佳实践。 ... [详细]
  • 开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用
    开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 如何在 Java LinkedHashMap 中高效地提取首个或末尾的键值对? ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 在Python编程中,掌握高级技巧对于提升代码效率和可读性至关重要。本文重点探讨了生成器和迭代器的应用,这两种工具不仅能够优化内存使用,还能简化复杂数据处理流程。生成器通过按需生成数据,避免了大量数据加载对内存的占用,而迭代器则提供了一种优雅的方式来遍历集合对象。此外,文章还深入解析了这些高级特性的实际应用场景,帮助读者更好地理解和运用这些技术。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文将详细介绍在Android应用中添加自定义返回按钮的方法,帮助开发者更好地理解和实现这一功能。通过具体的代码示例和步骤说明,本文旨在为初学者提供清晰的指导,确保他们在开发过程中能够顺利集成返回按钮,提升用户体验。 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • 在Java中,匿名函数作为一种无名的函数结构,无法独立调用;而在JavaScript中,不仅有类似的匿名函数,还有立即执行函数(IIFE)和闭包等高级特性。立即执行函数同样基于匿名函数实现,但会在定义时立即执行,而闭包则通过嵌套函数来捕获外部变量,实现数据封装和持久化。这些不同的函数形式在实际开发中各有应用场景,理解其特点有助于更好地利用语言特性进行编程。 ... [详细]
  • 在处理高并发场景时,确保业务逻辑的正确性是关键。本文深入探讨了Java原生锁机制的多种细粒度实现方法,旨在通过使用数据的时间戳、ID等关键字段进行锁定,以最小化对系统性能的影响。文章详细分析了不同锁策略的优缺点,并提供了实际应用中的最佳实践,帮助开发者在高并发环境下高效地实现锁机制。 ... [详细]
author-avatar
拍友2502902623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有