JWT令牌验证

2023-10-27

目录

一、JWT介绍

二、安装依赖

 三、登陆接口

1、令牌工具类

2、接口代码

四、说明


一、JWT介绍

JWT全称:JSON Web Token (官网:JSON Web Tokens - jwt.io

  • 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。

    简洁:是指jwt就是一个简单的字符串。可以在请求参数或者是请求头当中直接传递。

    自包含:指的是jwt令牌,看似是一个随机的字符串,但是我们是可以根据自身的需求在jwt令牌中存储自定义的数据内容。如:可以直接在jwt令牌中存储用户的相关信息。

    简单来讲,jwt就是将原始的json数据格式进行了安全的封装,这样就可以直接基于jwt在通信双方安全的进行信息传输了。

JWT的组成: (JWT令牌由三个部分组成,三个部分之间使用英文的点来分割)

  • 第一部分:Header(头), 记录令牌类型、签名算法等。 例如:{"alg":"HS256","type":"JWT"}

  • 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}

  • 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。

    签名的目的就是为了防jwt令牌被篡改,而正是因为jwt令牌最后一个部分数字签名的存在,所以整个jwt 令牌是非常安全可靠的。一旦jwt令牌当中任何一个部分、任何一个字符被篡改了,整个令牌在校验的时候都会失败,所以它是非常安全可靠的。

 

JWT是如何将原始的JSON格式数据,转变为字符串的呢?

其实在生成JWT令牌时,会对JSON格式的数据进行一次编码:进行base64编码

Base64:是一种基于64个可打印的字符来表示二进制数据的编码方式。既然能编码,那也就意味着也能解码。所使用的64个字符分别是A到Z、a到z、 0- 9,一个加号,一个斜杠,加起来就是64个字符。任何数据经过base64编码之后,最终就会通过这64个字符来表示。当然还有一个符号,那就是等号。等号它是一个补位的符号

需要注意的是Base64是编码方式,而不是加密方式。

二、安装依赖

<!-- JWT依赖-->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

 三、登陆接口

1、令牌工具类

public class JwtUtils {

    private static String signKey = "zqhjwt";//签名密钥
    private static Long expire = 43200000L; //有效时间

    /**
     * 生成JWT令牌
     * @param claims JWT第二部分负载 payload 中存储的内容
     * @return
     */
    public static String generateJwt(Map<String, Object> claims){
        String jwt = Jwts.builder()
                .addClaims(claims)//自定义信息(有效载荷)
                .signWith(SignatureAlgorithm.HS256, signKey)//签名算法(头部)
                .setExpiration(new Date(System.currentTimeMillis() + expire))//过期时间
                .compact();
        return jwt;
    }

    /**
     * 解析JWT令牌
     * @param jwt JWT令牌
     * @return JWT第二部分负载 payload 中存储的内容
     */
    public static Claims parseJWT(String jwt){
        Claims claims = Jwts.parser()
                .setSigningKey(signKey)//指定签名密钥
                .parseClaimsJws(jwt)//指定令牌Token
                .getBody();
        return claims;
    }
}

2、接口代码

LoginController

@RestController
public class LoginController {

    @Autowired
    EmpService empService;

    @PostMapping("login")
    public Result login(@RequestBody Emp emp){

        Emp e =  empService.login(emp);

        if(e!= null)
        {
            Map<String,Object> clzims = new HashMap<>();
            clzims.put("id",e.getId());
            clzims.put("name",e.getName());
            clzims.put("username",e.getUsername());
            // 生成jwt令牌
            String jwt = JwtUtils.generateJwt(clzims);

            return Result.success(jwt);
        }


        return  Result.error("用户名或密码错误");


    }


}

Service

@Override
    public Emp login(Emp emp) {

        Emp loginEmp = empMapper.getByUerAndPsw(emp);

        return loginEmp;
    }

mapper

@Select("SELECT * from emp where username = #{username} and password = #{password}")
    Emp getByUerAndPsw(Emp emp);

四、说明

需求:

  1. 生成令牌

    在登录成功之后来生成一个JWT令牌,并且把这个令牌直接返回给前端
  2. 校验令牌

    拦截前端请求,从请求中获取到令牌,对令牌进行解析校验

步骤:

  1. 引入JWT工具类

    在项目工程下创建uitle包,并把提供JWT工具类复制到该包下
  2. 登录完成后,调用工具类生成JWT令牌并返回

接口文档

  • 响应数据

    参数格式:application/json

    参数说明:

    名称 类型 是否必须 默认值 备注 其他信息
    code number 必须 响应码, 1 成功 ; 0 失败
    msg string 非必须 提示信息
    data string 必须 返回的数据 , jwt令牌

    响应数据样例:

    {
      "code": 1,
      "msg": "success",
      "data": "eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi6YeR5bq4IiwiaWQiOjEsInVzZXJuYW1lIjoiamlueW9uZyIsImV4cCI6MTY2MjIwNzA0OH0.KkUc_CXJZJ8Dd063eImx4H9Ojfrr6XMJ-yVzaWCVZCo"
    }
  • 备注说明

    用户登录成功后,系统会自动下发JWT令牌,然后在后续的每次请求中,都需要在请求头header中携带到服务端,请求头的名称为 token ,值为 登录时下发的JWT令牌。

    如果检测到用户未登录,则会返回如下固定错误信息:

    {
      "code": 0,
      "msg": "NOT_LOGIN",
      "data": null
    }

解读完接口文档中的描述了,目前我们先来完成令牌的生成和令牌的下发,我们只需要生成一个令牌返回给前端就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JWT令牌验证 的相关文章

随机推荐

  • 抓取一闪而过的提示消息文本

    前端业务操作出现一闪而过的message提示信息 它们有一个特点就是显示1 2s后会自动消失 例如下图1 图1 这些消息不像 alert 警告框 confirm 确认框 和prompt 提示框 那样 需要用户手动点击确定或取消按钮后才消失
  • 华为od机考真题-HJ32密码截取(中等)

    求最大回文子串 while 1 try str1 input if len str1 1 print 1
  • 渗透测试学习目录

    网络攻击防范 课程介绍 1 HTML 01 HTML标签和文本属性 02 form表单 input 标签 属性 03 a标签 img标签 table标签 04 无序列表和有序列表 05 frameset frame 框架的使用 2 div
  • VS离线安装NuGet包

    VS离线安装NuGet包 以VS 2017为例 一 下载NuGet包 官方NuGet包下载网址 https www nuget org 1 搜索需要下载的包名称 点击进入包详情页面 2 点击Download package 下载离线包 3
  • [NOI2011]阿狸的打字机【AC自动机fail树+树状数组】

    题目链接 P2414 题目给出N个字符串 我们现在想知道的是第x个字符串在第y个字符串中出现的次数是多少次 求每个字符在其余字符中出现次数 想到从AC自动机上走 其实可以看作是求它的后缀的前缀中有多少个是满足的 换言之 我们可以去fail树
  • 日前日内多阶段多时间尺度源荷储协调调度(matlab代码)

    多阶段多时间尺度的源荷储协调调度的优势是考虑新能源出力的波动性与随机性 减少需求响应负荷的不确定性会对电网制定的日前调度计划准确性的影响 也就是能够更加精准的进行调度和分析 优化结果的可用性更强 在这方面论文里面 金力的 考虑特性分布的储能
  • 如何利用excel中的数据源制作数据地图

    关于这个问题 制作数据地图的方法已不新奇 总体来说有这么几类方案 一类方案 直接在excel里制作 优势 个人小数据量应用较为方便简单 缺点 需要熟悉VBA 且更强大的功能对VBA水平要求较高 1 绘制地图图形 VBA宏语言 思路 用插入图
  • MOS管相关知识

    MOS管 MOS管的英文全称叫MOSFET Metal Oxide Semiconductor Field Effect Transistor 即金属氧化物半导体型场效应管 属于场效应晶体管中的绝缘栅型 MOS管是场效应管的一种 在一般电子
  • 版本号自动生成方法

    只需把 AssemblyInfo cs文件中的 assembly AssemblyVersion 1 0 0 0 改成 assembly AssemblyVersion 1 0 另外还需要把 assembly AssemblyFileVer
  • 什么是负载均衡,看完文章秒懂

    一 负载均衡简介 1 1 大型网站面临的挑战 大型网站都要面对庞大的用户量 高并发 海量数据等挑战 为了提升系统整体的性能 可以采用垂直扩展和水平扩展两种方式 垂直扩展 在网站发展早期 可以从单机的角度通过增加硬件处理能力 比如 CPU 处
  • 运行时报错“version `GLIBCXX_3.4.29‘ not found”底层原理分析

    文章目录 1 报错的现象 2 为什么程序有的报找不到某个版本的动态库 有的报找不到动态库文件 2 1 找不到动态库 2 2 找不到某个版本的动态库 2 2 1 报错的原因 2 2 2 动态库的版本是如何指定的 程序又是如何记录依赖的动态库版
  • DecimalField的使用

    DecimalField 类 DecimalField max digits 无 decimal places 无 选项 固定精度的十进制数 在Python中表示一个 十进制的实例 有两个必需的参数 DecimalField max dig
  • 浏览器插件下载“Download failed. Please check your connection.”解决方法

    第一步 查看错误原因 Download failed Please check your connection 下载失败 请检查您的连接 第二步 根据问题根源查看connects相关设置 第三步 分析原因 我是开启了Manual proxy
  • NeRF必读:Instant-NGP----RTX3090单卡就能玩转NeRF

    前言 NeRF从2020年发展至今 仅仅三年时间 而Follow的工作已呈井喷之势 相信在不久的将来 NeRF会一举重塑三维重建这个业界 甚至重建我们的四维世界 开头先吹一波 NeRF的发展时间虽短 有几篇工作却在我研究的领域开始呈现万精油
  • C语言---双向链表(详解)---数据结构

    双向链表所需要头文件 首先重定义类型名 意义我前几篇讲过几次了 这里就不在赘述了 顺序表 单链表的开头都有说明 然后我们需要一个结构体 结构体包含 存储数据的 a 指向一个节点的指针 next 指向上一个节点的指针 prve 双向链表实现的
  • pgadmin4更改数据类型和主键

    在 pgAdmin 4 中更改数据类型和主键需要以下步骤 打开 pgAdmin 4 连接到您想要修改的数据库 找到并打开您想要修改的表 单击该表后单击 设计 按钮 找到要修改的列 单击该列后单击 编辑 删除 按钮 在弹出的窗口中 更改 数据
  • hai子兄弟表示法(C语言实现)——树的存储结构

    孩子兄弟表示法实际就是创建一棵二叉树 include
  • 统计中位数为 K 的子数组

    给你一个长度为n的数组nums 该数组由从1 到n的不同整数组成 另给你一个正整数k 统计并返回nums中的 中位数等于k的非空子数组的数目 注意 数组的中位数是按递增顺序排列后位于中间的那个元素 如果数组长度为偶数 则中位数是位于中间靠左
  • 音频系统POP音的原理和解决方法

    音频系统POP音的原理和解决方法 目录 文章目录 音频系统POP音的原理和解决方法 目录 音频IC与功放IC的电源时序与功能模块使能时序 功放IC输入端INP与INN的阻抗匹配 增大VBIAS滤波电容 BTL输出和SE输出 减小输出端耦合电
  • JWT令牌验证

    目录 一 JWT介绍 二 安装依赖 三 登陆接口 1 令牌工具类 2 接口代码 四 说明 一 JWT介绍 JWT全称 JSON Web Token 官网 JSON Web Tokens jwt io 定义了一种简洁的 自包含的格式 用于在通