SpringBoot之JWT令牌校验
创始人
2024-12-26 18:41:26
0

SpringBoot之JWT令牌校验

本文根据黑马b站springboot3+vue3课程

封面

JWT

(JSON Web Token)是一种开放标准(RFC 7519),用于在不同实体之间安全地传输信息。它由三个部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

  1. 头部(Header):头部通常由两部分组成,标识token的类型和所使用的签名算法,例如:
{   "alg": "HS256",   "typ": "JWT" } 

这表示该JWT使用HS256算法进行签名,并且是一个JWT类型的token。

  1. 载荷(Payload):载荷是JWT的第二部分,也称为Claim。它包含了要传输的数据,可以是用户的身份信息、权限信息等。载荷分为三个部分:

    • 注册声明(Registered Claims):这些是预定义的声明,包含了一些标准的信息,如iss(签发者)、sub(主题)、aud(接收者)、exp(过期时间)、nbf(生效时间)、iat(签发时间)等。
    • 公共声明(Public Claims):这些是自定义的声明,用于传递一些非强制性的信息,例如用户的角色、权限等。
    • 私有声明(Private Claims):这些也是自定义的声明,用于在JWT的发送和接收方之间共享信息,但它们不是JWT规范的一部分,只是双方之间协商的私有信息。
  2. 签名(Signature):签名是JWT的第三部分,用于验证消息的完整性和来源。它由使用私钥对头部和载荷进行签名的结果组成,以确保数据在传输过程中没有被篡改。

JWT通常用于身份验证和信息交换。例如,在 Web 应用程序中,当用户成功登录后,服务器会生成一个JWT并将其发送回客户端,客户端将JWT存储起来,并在后续的请求中将其发送给服务器进行身份验证。服务器收到JWT后,会验证其签名和有效期,并根据载荷中的信息来决定是否授权用户访问特定的资源。
在这里插入图片描述
在这里插入图片描述
依赖

在这里插入图片描述
如果输入正确的账号密码在本机访问如下
在这里插入图片描述

public class JwtTest {     @Test      public void testGen() {         Map claims = new HashMap<>();         claims.put("id", 1);         claims.put("username", "张三");         //生成jwt的代码         String token = JWT.create()                 .withClaim("user", claims)//添加载荷                 .withExpiresAt(new Date(System.currentTimeMillis() + 1000*60*60))//添加过期时间                 .sign(Algorithm.HMAC256("itheima"));//指定算法,配置秘钥          System.out.println(token);      }  

创建步骤

  1. 创建Payload(载荷):将需要在JWT中传输的信息组织成一个键值对的形式。Payload可以包含任何您希望传递的信息,例如用户ID、用户名等。在您的示例中,您创建了一个包含用户ID和用户名的Map作为Payload。

  2. 设置过期时间:为了增加安全性,通常会设置JWT的过期时间。过期时间可以是一个具体的日期时间,也可以是一个相对于当前时间的时间段。在您的示例中,您通过withExpiresAt方法设置了JWT的过期时间为当前时间后的一小时。

  3. 选择签名算法并配置密钥:JWT需要使用密钥对其进行签名,以确保其完整性和安全性。在您的示例中,您选择了HMAC256算法,并通过sign方法传入了密钥"itheima"。

  4. 生成JWT:使用以上设置,调用相应的JWT库方法来生成JWT。在您的示例中,您调用了JWT.create().withClaim().withExpiresAt().sign()方法来生成JWT。

  5. 获取生成的JWT:生成JWT后,您可以将其打印输出或将其传递给需要使用JWT的其他部分。

总的来说,JWT生成的过程就是根据需要传递的信息创建Payload,设置过期时间,选择签名算法并配置密钥,然后生成JWT。完成这些步骤后,您就可以使用生成的JWT进行身份验证或在网络请求中传递用户信息等。

    @Test     public void testParse() {         //定义字符串,模拟用户传递过来的token         String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6IuW8oOS4iSJ9LCJleHAiOjE3MTMzNDAyMjJ9.tHPeqYz93mt7lTPuyV_tFlR-2lfxkRB4l7DHDyXN5_s";          JWTVerifier jwtVerifier = com.auth0.jwt.JWT.require(Algorithm.HMAC256("itheima")).build();          DecodedJWT decodedJWT = jwtVerifier.verify(token);//验证token,生成一个解析后的JWT对象         Map claims = decodedJWT.getClaims();         System.out.println(claims.get("user"));          //如果篡改了头部和载荷部分的数据,那么验证失败         //如果秘钥改了,验证失败         //token过期 

下面是解析JWT的步骤:

  1. 定义JWT字符串:您首先定义了一个JWT字符串,模拟了用户传递过来的token。

  2. 创建JWTVerifier:使用相同的签名算法和密钥,创建一个JWTVerifier对象。在这个示例中,您使用了与生成JWT时相同的HMAC256算法和相同的密钥"itheima"。

  3. 验证token并解析JWT:调用JWTVerifier的verify方法来验证token,并生成一个解析后的JWT对象。如果token通过验证,将返回一个DecodedJWT对象,其中包含了JWT的头部、载荷和签名信息。

  4. 获取Payload信息:从解析后的JWT对象中获取载荷(Payload)部分的信息。在您的示例中,您获取了"user"键对应的值,这是一个包含用户信息的Map。

  5. 处理验证失败的情况:在实际应用中,您可能还需要处理验证失败的情况。验证可能失败的原因包括token被篡改、密钥不匹配、token过期等。在这个示例中,您并没有处理验证失败的情况,但在实际应用中,您应该根据具体情况采取适当的处理措施。

通过这些步骤,您可以成功解析JWT,并从中获取到用户的信息或其他载荷信息。这样,您就可以在应用中使用JWT来实现身份验证或传递用户信息等功能。

package org.itheima.controller;  import org.itheima.pojo.Result; import org.itheima.utils.JwtUtil; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;  import javax.servlet.http.HttpServletResponse; import javax.xml.ws.Response; import java.util.Map;  @RestController @RequestMapping("/article") public class ArticleController {     @GetMapping("/list")     public Result list(@RequestHeader (name = "Authorization") String token, HttpServletResponse response){         try {             //验证token             Map claims=JwtUtil.parseToken(token);             return Result.success("成功");         } catch (Exception e) {             response.setStatus(401);             return Result.error("未登录");         }              } } 

根据servelt中的HttpServletResponse 来显示返回的值

相关内容

热门资讯

透视辅助"德普之星透... 透视辅助"德普之星透视辅助软件下载"详细辅助2025新版(先前是真的有挂);玩家必备必赢加哟《136...
4分钟了解!wepoker辅助... 4分钟了解!wepoker辅助器安装包定制(透视)外挂透视辅助4(都是存在有挂);1、wepoker...
实测交流!财神十三脚本,超级三... 自定义超级三加一辅助下载系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用辅助器,不...
透视肯定"微信西楚辅... 透视肯定"微信西楚辅助"详细辅助科技教程(都是是有挂)1、下载好微信西楚辅助辅助软件之后点击打开,先...
透视玄学"hhpok... 透视玄学"hhpoker免费透视脚本"详细辅助新2025教程(原来存在有挂);亲真的是有正版授权,小...
3分钟了解!hhpoker是内... 3分钟了解!hhpoker是内部控制吗(透视)外挂透视辅助3(好像是有挂);1、让任何用户在无需hh...
一分钟了解!陕麻圈辅助器怎么安... 一分钟了解!陕麻圈辅助器怎么安装,七千在线十三道辅助(详细辅助高科技教程);致您一封信;亲爱陕麻圈辅...
透视能赢"神途免费辅... 透视能赢"神途免费辅助软件"详细辅助新版2025教程(都是存在有挂)1、不需要AI权限,帮助你快速的...
信息共享!微信超级三加一辅助软... 信息共享!微信超级三加一辅助软件,中至余干麻将有没有挂(详细辅助技巧教程)1、在微信超级三加一辅助软...
透视辅助"wepok... 透视辅助"wepoker私人局俱乐部"详细辅助黑科技教程(原生真的有挂);人气非常高,ai更新快且高...