jwt分析及生成

JWT

JSON Web Token


jwt的格式可分为3部分

1、Header中一般包括两部分信息

{
  "alg": "RS256",
  "typ": "JWT"
}
  • alg:声明加密的算法
  • typ:声明类型

2、playload(负载)

不在playload中放敏感数据信息

  • 标准声明
  • 公共声明
  • 私有声明

标准声明包括:(不强制)

iss?: string; // JWT的签发者
sub?: string; // JWT所面向的用户
aud?: string; // 接收JWT的一方
exp?: number; // JWT的过期时间
nbf?: number; // 在xxx日期之间,该JWT都是可用的
iat?: number; // 该JWT签发的时间
jti?: number; //JWT的唯一身份标识

3、signature(签证)

加密算法(header (base64加密后)+payload (base64加密后)+secret(加盐))

生成jwt = 三部分用.拼接后的完整字符串

jwt的功能流程

jwt执行流程

jwt相应的优势

  • 简洁:Header、playload、signature三部分生成,数据量小
  • playload上包含用户信息,避免多次查询数据库

接下来看一个简单生成jwt token的例子
首先在maven引入相应jar包

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.10.3</version>
</dependency>

然后直接在在测试类中生成token

	@Test
    void contextLoads() {
        HashMap<String,Object> map = new HashMap<>();

        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND,20);

        String tooken = JWT.create().withHeader(map)
            .withClaim("username","xiaoming")
            .withClaim("userId",12)//注意这儿存的时候是int类型
            .withExpiresAt(instance.getTime())
            .sign(Algorithm.HMAC256("!@wqer@#%ERT"));

        System.out.println(tooken);//eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTM1NzEzMTEsInVzZXJJZCI6MjEsInVzZXJuYW1lIjoieGlhb21pbmcifQ.dtvLyuACByalZlk6Mr7lXtuxBRbTOs5ToLnQHTJIClM
    }

然后我们再写一个测试类去解析生成的token

	@Test
    public void test(){
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("!@wqer@#%ERT")).build();
        DecodedJWT verify = jwtVerifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTM1NzIxODcsInVzZXJJZCI6MjEsInVzZXJuYW1lIjoieGlhb21pbmcifQ.2BQ3RbUTAQfPOaKTaNS_Sfjsv1JJmmDL2Ci9SQ3r2XA");
        System.out.println(verify.getClaim("userId").asString());
        System.out.println(verify.getClaim("username").asString());
    }

在生成token的时候,在负载中存入的是

.withClaim("userId",12)

当执行去解析的时候使用asString(),发现结果为null
可以发现userId对应的值为int类型(12)

.getClaim("userId").asString() // null

尝试使用asInt,成功解析


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先需要说明的是,实现用户通过邮箱重设密码的代码是一个比较复杂的功能,需要多个技术点的组合使用。下面我将分别介绍利用SpringBoot、security、jwt、redis、MySQL、mybatis实现该功能的大致思路和各个类的作用。 1. SpringBoot SpringBoot是一个快速、方便的Spring框架搭建工具。通过SpringBoot,我们可以快速搭建一个Web应用程序,并集成各种开源框架和技术,大大提高了开发效率。在本文中,我们使用SpringBoot作为Web应用程序的底层框架。 2. Security Spring Security是Spring框架的安全框架,可以实现用户认证、授权等功能。在本文中,我们使用Spring Security来实现用户登录验证和访问权限控制。 3. JWT JWT(JSON Web Token)是一种用于身份认证的标准,可以在客户端和服务端之间安全地传递信息。在本文中,我们使用JWT生成和解析token,以实现用户身份验证和授权。 4. Redis Redis是一种内存数据库,可以快速读取和写入数据。在本文中,我们使用Redis来存储token和验证码等数据。 5. MySQL MySQL是一种关系型数据库,可以存储结构化的数据。在本文中,我们使用MySQL来存储用户信息和重设密码的过程记录。 6. Mybatis Mybatis是一种Java持久化框架,可以方便地与数据库进行交互。在本文中,我们使用Mybatis来实现与MySQL的交互。 7. Controller Controller是SpringMVC框架中的控制器,负责接收前端请求并调用相应的业务逻辑。在本文中,我们使用Controller来实现用户请求重设密码的接口。 8. Service Service是SpringMVC框架中的服务层,负责处理业务逻辑。在本文中,我们使用Service来实现生成验证码和发送邮件的功能,并处理用户重设密码的请求。 9. Mapper Mapper是Mybatis框架中的映射器,负责将Java对象与数据库表进行映射。在本文中,我们使用Mapper来实现与MySQL的交互。 10. Util Util是工具类,主要用于提供一些通用的函数和方法。在本文中,我们使用Util来实现一些公共的功能,如生成随机字符串等。 下面是实现用户通过邮箱重设密码的代码大致流程: 1. 用户向后端发送重设密码请求,后端生成一个随机验证码,并将验证码和用户的邮箱存储在Redis中,同时发送一封包含验证码的邮件给用户。 2. 用户在收到邮件后,将邮件中的验证码和自己的邮箱发送给后端,后端检查验证码是否正确,如果正确,则生成一个token(使用JWT),将token和用户信息存储在Redis中,并返回token给用户。 3. 用户向后端发送重设密码请求,并将之前收到的token一起发送给后端,后端检查token是否正确,如果正确,则允许用户重设密码。 4. 用户输入新密码后,后端将新密码更新到MySQL数据库中,并删除之前存储在Redis中的token和验证码等数据。 下面是各个类的大致作用: 1. UserController:接收用户请求,调用UserService处理业务逻辑。 2. UserService:处理业务逻辑,调用UserMapper与MySQL交互,调用EmailUtil发送邮件,调用JwtUtil生成和解析token,调用RedisUtil存储和读取数据。 3. UserMapper:定义与MySQL的交互方法,如插入用户信息、更新用户信息等。 4. EmailUtil:提供发送邮件的功能。 5. JwtUtil:提供生成和解析token的功能。 6. RedisUtil:提供存储和读取数据的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值