作者:拍友2502902623 | 来源:互联网 | 2024-10-31 20:06
本文深入探讨了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
结构介绍 :
Header 标头通常由两部分组成:令牌的类型(JWT)和正在使用的签名算法(如HMAC SHA256或RSA)。 例如: {"alg": "HS256", "typ": "JWT" } 这个JSON是Base64Url编码的,构成JWT的第一部分。
Payload 令牌的第二部分是有效载荷,其中包含声明。声明是关于实体(通常是用户)和其他数据的声明。索赔有三种类型:登记索赔、公开索赔和私人索赔。 {"sub": "1234567890","name": "John Doe","admin": true } 然后对有效负载进行Base64Url编码,形成JSON Web令牌的第二部分。
Signature 要创建签名部分,您必须获取编码的报头、编码的有效负载、一个秘密、报头中指定的算法,并对其进行签名。 HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)
4. jwt的第一个程序 spring boot 中使用jwt
*** 使用步骤:***
1.pom 中加入jwt相关依赖 com.auth0 java-jwt 3.18.3
2. 生成token令牌 在test中创建一个测试类
&#64;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) . withClaim ( "username" , "小三" ) . withClaim ( "userId" , "4893210" ) . withExpiresAt ( calendar. getTime ( ) ) . sign ( Algorithm. HMAC256 ( "hahaha" ) ) ; System. out. println ( token) ; }
运行测试&#xff0c;结果如: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwhv8rYU-1647054628015)(C:\Users\孙肖飞\AppData\Roaming\Typora\typora-user-images\image-20220312105444212.png)]
3. 验证token令牌 &#64;Test public void test01 ( ) { JWTVerifier jwtVerifier &#61; JWT. require ( Algorithm. HMAC256 ( "hahaha" ) ) . build ( ) ; DecodedJWT verify &#61; jwtVerifier. verify ( String token) ; System. out. println ( verify. getClaim ( "username" ) ) ; System. out. println ( verify. getClaim ( "userId" ) ) ; }
运行测试&#xff0c;结果&#xff1a;
5. jwt封装 private static final String signal &#61; "hahaha" ; public static String getToken ( Map< String, String> map) { String token &#61; null; JWTCreator. Builder builder &#61; JWT. create ( ) ; Set< 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; }
public static void verifyToken ( String token) { JWTVerifier require &#61; JWT. require ( Algorithm. HMAC256 ( signal) ) . build ( ) ; require. verify ( token) ; }