JWT快速入门

概念

基本概念

JWT全称是JSON Web Tokens,它是一种通用的基于文本的消息传输格式。常作为用户进入Web系统的令牌

JWT组成

JWT由三段Base64编码组成,它们之间用.分隔,从左到右依次是JWT头部的Base64编码、JWT载荷的Base64编码、JWT签名的Base64编码
例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
  • JWT头部
    JWT头部经过Base64解码后是一串JSON字符串,记录签名算法类型等信息
  • JWT载荷
    JWT载荷经过Base64解码后是一串JSON字符串,记录有效信息,如用户标识等信息就可以存储到载荷中
  • JWT签名
    *JWT签名记录签名信息,签名信息是JWT头部的base64编码+JWT载荷的base64编码+key通过签名算法生成的

JWT使用

准备工作

  • 引入maven依赖
 <dependencies>
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt-api</artifactId>
      <version>0.12.5</version>
    </dependency>
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt-impl</artifactId>
      <version>0.12.5</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
      <version>0.12.5</version>
      <scope>runtime</scope>
    </dependency>
  </dependencies>

JWT演示

  • HS256算法 – 通过 subject 方法设置载荷信息
    void jwtByHS256() {
        // 签名需要用到的key
        SecretKey key = Jwts.SIG.HS256.key().build();
        // 默认使用HS256算法进行签名,带有签名的JWT成为JWS
        String jws = Jwts.builder().subject("小红").signWith(key).compact();
        System.out.println("生成的JWS:" + jws);
        Claims payload = Jwts.parser().verifyWith(key).build().parseSignedClaims(jws).getPayload();
        System.out.println("载荷信息:" + payload);
    }

通过 subject 方法设置载荷信息,其实就是将载荷信息存到名为sub的属性中

  • HS384算法 – 通过 claims 方法设置载荷信息
    void jwtByHS384() {
        MacAlgorithm hs384 = Jwts.SIG.HS384;
        SecretKey key = hs384.key().build();
        Map<String, Object> info = new HashMap<>();
        info.put("name", "小北");
        info.put("age", 19);
        String jws = Jwts.builder().claims(info).signWith(key, hs384).compact();
        System.out.println("生成的JWS:" + jws);
        Claims payload = Jwts.parser().verifyWith(key).build().parseSignedClaims(jws).getPayload();
        System.out.println("载荷信息:" + payload);
    }

如果载荷信息是一个map集合,可以通过 claims 方法设置载荷信息

  • HS512算法 – 通过 content 方法设置载荷信息
    void jwtByHS512() throws JsonProcessingException {
        MacAlgorithm hs512 = Jwts.SIG.HS512;
        SecretKey key = hs512.key().build();
        Map<String, Object> info = new HashMap<>();
        info.put("name", "小林");
        info.put("age", 18);
        ObjectMapper objectMapper = new ObjectMapper();
        String infoStr = objectMapper.writeValueAsString(info);
        String jws = Jwts.builder().content(infoStr).signWith(key, hs512).compact();
        System.out.println("生成的JWS:" + jws);
        Claims payload = Jwts.parser().verifyWith(key).build().parseSignedClaims(jws).getPayload();
        System.out.println("载荷信息:" + payload);
    }

如果载荷信息是一个JSON字符串,可以通过 content 方法设置载荷信息

  • RSA算法 – 通过 claims 方法设置载荷信息
    void jwtByRSA() {
        SignatureAlgorithm rs512 = Jwts.SIG.RS512;
        KeyPair keyPair = rs512.keyPair().build();
        Map<String, Object> info = new HashMap<>();
        info.put("name", "小兰");
        info.put("age", 20);
        // 私钥加密
        String jws = Jwts.builder().claims(info).signWith(keyPair.getPrivate(), rs512).compact();
        System.out.println("生成的JWS:" + jws);
        Claims payload = Jwts.parser().verifyWith(keyPair.getPublic()).build().parseSignedClaims(jws).getPayload();
        System.out.println("载荷信息:" + payload);
    }

使用RS512非对称加密算法生成JWS

参考来源

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在创建项目时,可以使用Maven将com.auth0的java-jwt依赖项添加到pom.xml中。 关于为什么要使用两个JWT token的问题,原因是这两个token有不同的职责。access token用于业务系统交互,是最核心的数据,而refresh token则用于向认证中心获取新的access token和refresh token。当用户超过30分钟后,access token已经失效,此时将access token发送给认证中心是无法解析的。但refresh token由于生存时间更长且与access token的主体内容一致,因此发送给认证中心后可以被正确解析,并生成新的access token和refresh token。这样就能实现token的替换和更新。 在JWT中,还有一些标准的声明,包括注册的声明和私有的声明。注册的声明是一些标准中推荐使用的声明,包括iss(jwt签发者)、sub(jwt所面向的用户)、aud(接收jwt的一方)、exp(jwt的过期时间)、nbf(定义在什么时间之前该jwt是不可用的)、iat(jwt的签发时间)和jti(jwt的唯一身份标识,用于防止重放攻击)。 所以,jwt token依赖包括com.auth0的java-jwt和相关的标准声明。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [DecodeIdToken:通过JWT解码ID TOKEN](https://download.csdn.net/download/weixin_42138788/15396844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [JWT快速入门及所需依赖](https://blog.csdn.net/huangziweilii/article/details/128334713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值