JWT基础入门
都依凡
撰写于 2023年 05月 12 日

JWT基础入门

## 1. 介绍

JWT 全称:JSON Web Token

JWT官网:JSON Web Tokens - jwt.io

JWT定义了一种简洁的、自包含式,用于在通信双方以JSON数据格式安全传输信息。

由于数字签名的存在,这些信息是可靠的。

2. 组成

  • Header (头):记录令牌的类型,签名算法等,如:{alg:"H5256",Type:"JWT"}
基于Base 64 编码来表示二进制的编码方式
  • payLoad (有效荷载) :携带一些自定义信息,默认信息等,如:{id:"1",username:"Tom"}
基于Base 64 编码来表示二进制的编码方式
  • signature (签名) ,防止Token被篡改,确保安全性,将Header、payload、并加入指定密钥,通过指定签名算法而来
签名算法中融入头部分和信息部分,不是base 64编码

134

3. JWT令牌生成和解析

1. 导入jar包

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

2. 令牌生成

       SignatureAlgorithm hs256 = SignatureAlgorithm.HS256;// 设置签名算法
        String signKey = "LuckyDu"; // 加盐 不能过短,过短会报错,至少4个字符,具体版本不同可能不一样

        HashMap<String, Object> map = new HashMap<>(); // 数据存储
        map.put("id",1);
        map.put("name","LuckyDu");

        Date timeOut = new Date(System.currentTimeMillis() + 3600*1000); //设置过期时间

        String compact = Jwts.builder()
                .signWith(hs256, signKey) // 设置JWT头部信息,加密算法和盐值
                .setClaims(map) // 设置JWT的荷载信息,需要一个Map集合存储
                .setExpiration(timeOut) // 设置过期时间,设置的是时间点
                .compact(); // 调用生成令牌
        System.out.println("compact = " + compact);

注意:

 1. 加盐不能过短,否则会抛出一个异常
 2. 数据存储需要一个Map集合
 3. 过期时间填写的是在什么时间过期
 4. 调用compact生成令牌

3. 令牌解析

        String compact = ""; // JWT生成的Token令牌
        String signKey = "luckyDu"; // 在生成令牌时的 盐值,要保证生成和解析的值一样
        JwsHeader header = Jwts.parser() // 解析JWT令牌方法
                .setSigningKey(signKey) // 设置盐值
                .parseClaimsJws(compact) // 传入生成的令牌
              //.getHeader(); // 获取到JWT令牌的第一部分内容 头信息
              //.getBody();// 获取令牌的荷载信息
              //        Object id = body.get("id"); // 在荷载信息中通过key寻找对应的value值
              //.getSignature()  // 获取到JWT令牌的第三部分签名内容

注意:

 1. 在生成令牌时的 盐值,要保证生成和解析的值一样
 2. 在JWT解析时,若没有抛出异常,那么JWT解析为正确,抛出异常基本为以下几种,部分可能未发现,自测
        // 头部信息出错抛出异常  MalformedJwtException

        // 荷载信息出错抛出异常 SignatureException  
                JWT签名与本地计算的签名不匹配。JWT有效性不能断言,不应该被信任。

        // 签名信息出错抛出异常 SignatureException  
                JWT签名与本地计算的签名不匹配。JWT有效性不能断言,不应该被信任。

        // JWT令牌过期抛出异常 ExpiredJwtException

4. 项目中使用

在前后端分离的项目中使用的时候我们只需要将我们生成的 JWT令牌传输发送给前端

在每次前端向服务端发送请求时需要在头部请求信息中加上token字段,携带上我们的token信息

若token不存在或出现问题后端给予对应的响应即可

5. Java工具类

Java 工具类可在本博客中搜索jwt工具类

JWT基础入门

JWT基础入门

## 1. 介绍

JWT 全称:JSON Web Token

JWT官网:JSON Web Tokens - jwt.io

JWT定义了一种简洁的、自包含式,用于在通信双方以JSON数据格式安全传输信息。

由于数字签名的存在,这些信息是可靠的。

2. 组成

  • Header (头):记录令牌的类型,签名算法等,如:{alg:"H5256",Type:"JWT"}
基于Base 64 编码来表示二进制的编码方式
  • payLoad (有效荷载) :携带一些自定义信息,默认信息等,如:{id:"1",username:"Tom"}
基于Base 64 编码来表示二进制的编码方式
  • signature (签名) ,防止Token被篡改,确保安全性,将Header、payload、并加入指定密钥,通过指定签名算法而来
签名算法中融入头部分和信息部分,不是base 64编码

134

3. JWT令牌生成和解析

1. 导入jar包

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

2. 令牌生成

       SignatureAlgorithm hs256 = SignatureAlgorithm.HS256;// 设置签名算法
        String signKey = "LuckyDu"; // 加盐 不能过短,过短会报错,至少4个字符,具体版本不同可能不一样

        HashMap<String, Object> map = new HashMap<>(); // 数据存储
        map.put("id",1);
        map.put("name","LuckyDu");

        Date timeOut = new Date(System.currentTimeMillis() + 3600*1000); //设置过期时间

        String compact = Jwts.builder()
                .signWith(hs256, signKey) // 设置JWT头部信息,加密算法和盐值
                .setClaims(map) // 设置JWT的荷载信息,需要一个Map集合存储
                .setExpiration(timeOut) // 设置过期时间,设置的是时间点
                .compact(); // 调用生成令牌
        System.out.println("compact = " + compact);

注意:

 1. 加盐不能过短,否则会抛出一个异常
 2. 数据存储需要一个Map集合
 3. 过期时间填写的是在什么时间过期
 4. 调用compact生成令牌

3. 令牌解析

        String compact = ""; // JWT生成的Token令牌
        String signKey = "luckyDu"; // 在生成令牌时的 盐值,要保证生成和解析的值一样
        JwsHeader header = Jwts.parser() // 解析JWT令牌方法
                .setSigningKey(signKey) // 设置盐值
                .parseClaimsJws(compact) // 传入生成的令牌
              //.getHeader(); // 获取到JWT令牌的第一部分内容 头信息
              //.getBody();// 获取令牌的荷载信息
              //        Object id = body.get("id"); // 在荷载信息中通过key寻找对应的value值
              //.getSignature()  // 获取到JWT令牌的第三部分签名内容

注意:

 1. 在生成令牌时的 盐值,要保证生成和解析的值一样
 2. 在JWT解析时,若没有抛出异常,那么JWT解析为正确,抛出异常基本为以下几种,部分可能未发现,自测
        // 头部信息出错抛出异常  MalformedJwtException

        // 荷载信息出错抛出异常 SignatureException  
                JWT签名与本地计算的签名不匹配。JWT有效性不能断言,不应该被信任。

        // 签名信息出错抛出异常 SignatureException  
                JWT签名与本地计算的签名不匹配。JWT有效性不能断言,不应该被信任。

        // JWT令牌过期抛出异常 ExpiredJwtException

4. 项目中使用

在前后端分离的项目中使用的时候我们只需要将我们生成的 JWT令牌传输发送给前端

在每次前端向服务端发送请求时需要在头部请求信息中加上token字段,携带上我们的token信息

若token不存在或出现问题后端给予对应的响应即可

5. Java工具类

Java 工具类可在本博客中搜索jwt工具类

版权属于:都依凡 所有,采用《知识共享署名许可协议》进行许可,转载请注明文章来源。

本文链接: http://blog.anlucky.cn/index.php/programming/135

赞 (1)

评论区(暂无评论)

啊哦,评论功能已关闭~