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


推荐阅读
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社区 版权所有