我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用JJWT及JWT讲解和工具类

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用JJWT及JWT讲解和工具类

1. 什么是JWT

JSON Web Token(JWT)是一个轻量级的认证规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。其本质是一个token,是一种紧凑的URL安全方法,用于在网络通信的双方之间传递。

2. JWT的构成

一个JWT实际上就是一个字符串,它由三部分组成:头部、载荷与签名

2.1 头部(Header)

头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等

头部可以被表示成一个JSON对象


{"typ":"JWT","alg":"HS256"}

在头部指明了签名算法是HS256算法。 我们进行BASE64编码,编码后的字符串如下:


eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。

由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。

三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。

JDK 中提供了非常方便的 BASE64Encoder 和 BASE64Decoder,用它们可以非常方便的完成基于 BASE64 的编码和解码

2.2 载荷(playload)

载荷是存放有效信息的地方,这些有效信息包含三个部分:

2.2.1 标准中注册的声明(建议但不强制使用)


iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

2.2.2 公共的声明

公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息。但不建议添加敏感信息,因为该部分在客户端可解密

2.2.3 私有的声明

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息

比如下面举例中的admin和name都属于自定的claim。这些claim跟JWT标准规定的claim区别在于:JWT规定的claim,JWT的接收方在拿到JWT之后,都知道怎么对这些标准的claim进行验证;而private claims不会验证,除非明确告诉接收方要对这些claim进行验证以及验证的规则

定义一个payload:


{"sub":"1234567890","name":"John Doe","admin":true}

然后将其进行base64加密,得到Jwt的第二部分:


eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

2.3 签证(signature)

JWT的第三部分是一个签证信息,这个签证信息由三部分组成:

header (base64后的)

payload (base64后的)

secret

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分:


TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

将这三部分用.连接成一个完整的字符串,构成了最终的jwt:


eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以secret就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了

3. JJWT的介绍

JJWT是一个提供端到端的JWT创建和验证的Java库

官方文档:https://github.com/jwtk/jjwt

4. JJWT的使用


<!--鉴权-->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.0</version>
</dependency>

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_class="lazy" data-src_OUTPeer;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
public class TestJWT {
    public static void main(String[] args) {
        testCreateJWT();
        testParseJWT();
    }
    public static void testCreateJWT() {
        JwtBuilder builder = Jwts.builder()
                .setId("404")                   // 设置唯一编号
                .setSubject("邢立豹")            // 设置主题 可以是JSON数据
                .setIssuedAt(new Date())        // 设置签发日期
                // .setExpiration(new Date())      // 设置过期时间
                // 设置签名 使用HS256算法 并设置SecretKey(字符串)
                .signWith(SignatureAlgorithm.HS256, "LICHUN");
        HashMap<String, Object> userInfo = new HashMap<>();
        userInfo.put("name","枯木何日可逢春");
        userInfo.put("age", "21");
        builder.addClaims(userInfo);
        System.out.println(builder.compact());
    }
    public static void testParseJWT() {
        String str = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI0MDQiLCJzdWIiOiLpgqLnq4vosbkiLCJpYXQiOjE2MzA2ODAzNTMsImV4cCI6MTYzMDY4MDM1MywibmFtZSI6Iuaer-acqOS9leaXpeWPr-mAouaYpSIsImFnZSI6IjIxIn0.59i5xfLz9A-wTOJI9KxkF7zqp4zsLEWRC5DYlcy_Akc";
        Claims claims = Jwts.parser()
                .setSigningKey("LICHUN")
                .parseClaimsJws(str)
                .getBody();
        System.out.println(claims);
    }
}

5. JWT工具类


package com.lichun.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
public class JWTUtil {
    // 有效期
    public static final Long JWT_TTL = 3600000L;
    // JWT令牌信息
    public static final String JWT_KEY = "LICHUN";
    public static String createJWT(String id, String subject, Long ttlMillis) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        if (ttlMillis == null) {
            ttlMillis = JWT_TTL;
        }
        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);
        SecretKey secretKey = generalKey();
        JwtBuilder builder = Jwts.builder()
                .setId(id)                      // 设置唯一编号
                .setSubject(subject)            // 设置主题 可以是JSON数据
                .setIssuer("admin")
                .setIssuedAt(now)               // 设置签发日期
                .setExpiration(expDate)         // 设置过期时间
                // 设置签名 使用HS256算法 并设置SecretKey(字符串)
                .signWith(SignatureAlgorithm.HS256, secretKey);
        return builder.compact();
    }
    
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getEncoder().encode(JWT_KEY.getBytes());
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }
    
    public static Claims parseJWT(String jwt) throws Exception {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }
}

以上就是如何使用JJWT及JWT讲解和工具类的详细内容,更多关于JWT讲解与JJWT使用的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用JJWT及JWT讲解和工具类

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用axis调用WebService及Java WebService调用工具类

Axis是一个基于Java的Web服务框架,可以用来调用Web服务接口,下面这篇文章主要给大家介绍了关于如何使用axis调用WebService及Java WebService调用工具类的相关资料,需要的朋友可以参考下
2023-05-17

如何正确的使用StringUtils工具类

这期内容当中小编将会给大家带来有关如何正确的使用StringUtils工具类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。可以使用StringUtils工具类来做字符串的操作isEmpty(String
2023-05-31

如何在Java中使用Collections工具类

本篇文章为大家展示了如何在Java中使用Collections工具类,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数
2023-06-14

Java并发工具类Future如何使用

这篇文章主要讲解了“Java并发工具类Future如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java并发工具类Future如何使用”吧!前言Future是一个接口类,定义了5个方
2023-06-30

如何在Java中使用Semaphore工具类

这篇文章将为大家详细讲解有关如何在Java中使用Semaphore工具类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、Semaphore的理解Semaphore属于java.util.c
2023-06-15

如何在java中使用 Arrays工具类

如何在java中使用 Arrays工具类?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Arrays工具类属于java中常用的工具类public static void so
2023-05-31

如何在Java中使用EasyExcel工具类

今天就跟大家聊聊有关如何在Java中使用EasyExcel工具类,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web M
2023-06-14

如何在Springboot中使用RedisUtils工具类

如何在Springboot中使用RedisUtils工具类?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SpringBoot整合Redis引入Redis依赖