热门标签 | 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);}


推荐阅读
  • 本文详细介绍了一种利用局域网环境将本地SQL Server数据库备份至另一台计算机的方法。主要步骤包括在目标机器上设置共享文件夹、配置SQL Server以支持备份任务,并通过定时任务实现自动化备份。 ... [详细]
  • 一、搭建项目创建Maven项目导入rabbitmq包com.rabbitmqamqp-clien ... [详细]
  • 漫水填充算法是一种基于特定颜色填充连通区域的技术,通过设定像素连通性的阈值和连通模式,可以实现不同的填充效果。该算法广泛应用于图像处理领域,如图像分割、标记特定区域等。 ... [详细]
  • PHP 实现数据库数据处理并实时更新客户端状态
    本文介绍了使用 PHP 处理数据库中的数据,并在每次处理后实时向客户端反馈当前状态的方法。适合需要监控数据处理进度的应用场景。 ... [详细]
  • Spring Cloud实践:构建Eureka单节点注册中心
    本文详细介绍如何在Spring Cloud环境下搭建Eureka单节点注册中心,包括项目初始化、依赖添加、配置设置及启动测试等步骤。 ... [详细]
  • 当前,许多屏幕截图应用程序支持任意形状的截图功能。这引发了一个技术问题:如何高效地判断一个像素点是否位于指定的曲线或形状内部?本文将深入探讨这一问题,并提供一种简洁有效的解决方案。 ... [详细]
  • 最佳PHP源码加密工具推荐
    本文探讨了几款高效的PHP源码加密工具,旨在帮助开发者保护其代码免受未授权访问。文章不仅介绍了商业软件的选择,还提供了一些免费且实用的加密工具及其使用方法。 ... [详细]
  • 如何构建基于Dubbo协议的示例项目
    本文详细介绍了构建基于Dubbo协议的示例项目的步骤,包括环境搭建、服务接口定义、服务实现、配置文件设置及客户端调用等环节,旨在为初学者提供一个清晰的学习路径。 ... [详细]
  • Linux环境下配置Subclipse访问SVN+SSH仓库的方法
    本文详细介绍如何在Linux操作系统中配置Subclipse,以便通过SSH协议安全访问SVN仓库。不同于常见的Windows配置指南,本文提供了针对Linux用户的详细步骤。 ... [详细]
  • 本文探讨了如何将Hibernate Search 6(当前为Beta版)与Elasticsearch成功集成,特别是当遇到特定错误时的解决方案。 ... [详细]
  • 1整合dubbo1.1e3-manager-Service1.1.1pom.xml排除jar在e3-manager-Service工程中添加dubbo依赖的jar包。 ... [详细]
  • Qwik:一款创新的JavaScript框架,致力于提升网页应用的速度与响应性
    Qwik是一款新的JavaScript框架,旨在通过其独特的可恢复性机制,显著提高网页应用的加载速度和用户体验。 ... [详细]
  • C# WPF 打字射击游戏开发
    介绍了一个基于C#和WPF技术的简单打字射击游戏的实现方法,包括字母的生成、移动、消除以及基本的游戏界面设计。 ... [详细]
  • 本文详细介绍了如何在Apache Shiro框架中实现对并发登录人数的限制,包括配置和自定义过滤器的具体步骤。 ... [详细]
  • 学生信息管理系统架构设计与实现
    随着教育机构规模的扩大,学生人数的增多带来了信息管理上的挑战,传统的人工处理方式不仅耗时费力,且效率低下。为此,本文档提出了一种基于现代技术的学生信息管理系统的设计方案,旨在提高信息处理的效率和准确性。 ... [详细]
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社区 版权所有