JWT 使用入门(一)配置与示例

news2024/9/22 0:59:59

文章目录

  • 1、用途✨
  • 2、实现流程👀
  • 3、JWT介绍
    • 3.1、构成
      • 3.1.1、header
      • 3.1.2、载荷
      • 3.1.3、签证
  • 4、java实现
    • 4.1、引入依赖
    • 4.2、测试案例

官网链接:https://github.com/jwtk/jjwt

1、用途✨

JWT主要作用分为以下两种:

  • 1:作为在前后端分离项目中的登录策略
  • 2:单纯作为客户端的请求身份认证,spring-gateway网关进行判断拦截

这里我仅讲解第二种!第一种见链接:

2、实现流程👀

  • 1:服务方编写代码生成token,记录token给消费方
  • 2:消费方每次发来的请求,都要携带该token
  • 3:服务方部署网关对消费方发送来的token进行解密,判断是否有效:有效放行到服务端,否则进行拦截

注:这种不需要存储在服务端的认证方式时无状态认证方式,不同于session+cookie的有状态认证方式,其中好处主要为以下几点:

  • 客户端请求不依赖服务端的信息,多次请求不需要必须访问到同一台服务器
  • 减小服务端存储压力

3、JWT介绍

JWT,全称是Json Web Token, 是一种JSON风格的轻量级的授权和身份认证规范,可实现无状态、分布式的Web应用授权!

3.1、构成

JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。第一部分我们称它为头部(header),第二部分我们称其为载荷(payload),第三部分是签证(signature).

3.1.1、header

JWT头部分是一个描述JWT元数据的JSON对象,通常如下所示:

{
  "alg": "HS256",
}

在这里插入图片描述
有的文章说还包含:typ属性表示令牌的类型,JWT令牌统一写为JWT,但是我打印的如上图只有alg。

3.1.2、载荷

一共有7个字段可以设置,如下:

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

另外,可以自定义一些字段,如下:

{
  "admin": true
}

3.1.3、签证

生成语法:

HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

注:其中secret是密钥,不可泄漏,并且其生成也用到了头部信息和载荷信息。

JWT解析地址:https://jwt.io/#libraries

4、java实现

4.1、引入依赖

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

4.2、测试案例

生成代码:

package org.example;

import io.jsonwebtoken.*;
import io.jsonwebtoken.impl.Base64Codec;

import java.util.Date;

// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {
    public static void main(String[] args) {
        // Press Alt+Enter with your caret at the highlighted text to see how
        // IntelliJ IDEA suggests fixing it.

        //testJwt();
        generateJwtToken();
        testParseToken();

    }

    /** 测试生成token1 */
    public static void testJwt() {
        JwtBuilder jwtBuilder = Jwts.builder()
                // 唯一ID {"":""}
                .setId("888")
                // 接受的用户 {"sub":"Rose"}
                .setSubject("Rose")
                // 签发时间 {"iat":"。。。"}
                .setIssuedAt(new Date())
                // 签名算法 及秘钥
                .signWith(SignatureAlgorithm.HS256, "aVBhbkUxcEEyc1dvMmRCeVpM");
        // 签发token
        String token = jwtBuilder.compact();
        System.out.println(token);

        String[] split = token.split("\\.");
        // 头部
        System.out.println(Base64Codec.BASE64.decodeToString(split[0]));
        // 载荷
        System.out.println(Base64Codec.BASE64.decodeToString(split[1]));
        // 算法及秘钥 这个会乱码
        System.out.println(Base64Codec.BASE64.decodeToString(split[2]));
        
    }
	 /** 测试生成token2 */
    public static String generateJwtToken(){
 
        // 头部 map / Jwt的头部承载,第一部分
        // 可不设置 默认格式是{"alg":"HS256"}
        Map<String, Object> map = new HashMap<>();
            map.put("alg", "HS256");
            map.put("typ", "JWT");
 
 
        //载荷 map / Jwt的载荷,第二部分
        Map<String,Object> claims = new HashMap<String,Object>();
 
            //私有声明 / 自定义数据,根据业务需要添加
            claims.put("id","123456");
            claims.put("userName", "admin");
 
            //标准中注册的声明 (建议但不强制使用)
            //一旦写标准声明赋值之后,就会覆盖了那些标准的声明
            claims.put("iss", jwt_iss);
            /*	iss: jwt签发者
                sub: jwt所面向的用户
                aud: 接收jwt的一方
                exp: jwt的过期时间,这个过期时间必须要大于签发时间
                nbf: 定义在什么时间之前,该jwt都是不可用的.
                iat: jwt的签发时间
                jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
            */
 
 
        //下面就是在为payload添加各种标准声明和私有声明了
        return Jwts.builder() // 这里其实就是new一个JwtBuilder,设置jwt的body
                .setHeader(map)         // 头部信息
                .setClaims(claims)      // 载荷信息
                .setId(UUID.randomUUID().toString()) // 设置jti(JWT ID):是JWT的唯一标识,从而回避重放攻击。
                .setIssuedAt(new Date())       // 设置iat: jwt的签发时间
                .setExpiration(new Date(System.currentTimeMillis() + access_token_expiration * 1000)) // 设置exp:jwt过期时间
                .setSubject(subject)    //设置sub:代表这个jwt所面向的用户,所有人
                .signWith(SignatureAlgorithm.HS256, "aVBhbkUxcEEyc1dvMmRCeVpM");//设置签名:通过签名算法和秘钥生成签名
                .compact(); // 开始压缩为xxxxx.yyyyy.zzzzz 格式的jwt token
    }

    /** 解析token */
    public static void testParseToken() {
        String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiJSb3NlIiwiaWF0IjoxNjkwOTY1ODY3fQ.pT-fzrxquCmB5eLqIiPQfdow92c0ZJBHP79-W3KE898";
         //得到的是荷载
        Claims claims = (Claims) Jwts.parser()
                // 解析时的秘钥一定要和签发时秘钥相同,但是发现这了的秘钥为4-7个x都是可以成功解析的
                .setSigningKey("aVBhbkUxcEEyc1dvMmRCeVpM111")
                // .parse(token)
                .parseClaimsJws(token)
                .getBody();
        System.out.println(claims);
        // 得到的是头部
        JwsHeader test = Jwts.parser()
                // 解析时的秘钥一定要和签发时秘钥相同,但是发现这了的秘钥为4-7个x都是可以成功解析的
                .setSigningKey("aVBhbkUxcEEyc1dvMmRCeVpM111")
                // .parse(token)
                .parseClaimsJws(token)
                .getHeader();
        System.out.println(test);
    }
}

参考链接:
https://blog.csdn.net/qq_37138756/article/details/103499429

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1080442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

css修改滚动条

系统默认的滚动条可能不是很美观&#xff0c;有时候我们想要自己进行样式的修改&#xff0c;就可以用到下面的方法 设置滚动条的属性为overflow&#xff0c;取值是x轴和y轴 如果想单独设置某个轴&#xff0c;可以使用overflow-x,overflow-y <!DOCTYPE html> <html …

测试老鸟整理,Pytest自动化测试框架的一些关键点,一文贯通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Pytest自动化框架&…

Python自动查重之原理、方法与实践详解

什么是自动查重&#xff1f; 自动查重是指使用计算机程序来比较两个或多个文件的内容&#xff0c;判断它们之间是否存在相似或相同的部分&#xff0c;从而检测出抄袭或重复的情况。自动查重可以用于学术论文、代码、文本等各种类型的文件&#xff0c;帮助提高原创性和质量。 为…

kepler.gl 笔记:Layer

Point S2Layer Icon Line Cluster Polygon 一个路径型的GeoJSON图层可以显示诸如行程路线或等值线的数据。轮廓的颜色可以使用数值字段进行设置。 一个多边形型的GeoJSON图层本质上是一种区域填充图层&#xff0c;最适合用于呈现地理围栏。填充颜色或高度可以使用数值字…

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Toggle

组件提供勾选框样式、状态按钮样式及开关样式。该组件从API Version 8开始支持。 仅当ToggleType为Button时可包含子组件。 一、接口 Toggle(options: { type: ToggleType, isOn?: boolean }) 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 参数: Toggle…

Mac M1安装MongoDB6、后台运行

MongoDB&#xff0c;版本6.02 记录两种使用MongoDB的方法&#xff0c;安装包和docker docker mongo&#xff1a;Mac M1运行、连接 Docker MongoDB7。导出、恢复数据库 一、安装包&#xff0c;以mac M1为例 1、下载对应平台的安装包 M1选择ARM版本 https://www.mongodb.com/t…

SecureCRT 特点介绍 SecureCRT的安装和使用

SecureCRT 是一款支持SSH&#xff08;SSH1和SSH2&#xff09;的终端仿真程序&#xff0c;简单地说是Windows下登录UNIX或Linux服务器主机的软件&#xff0c;优点是可以一次创建多个 Tab Page&#xff0c;连接多台远程主机。 这里使用的是Mac版本的不过不影响&#xff0c;在Win…

RK3568平台开发系列讲解(驱动篇)RK3568 PWM详解

🚀返回专栏总目录 文章目录 一、什么是PWM二、RK3568 PWM2.1、PWM 通道与引脚2.2、PWM 简介2.3、PWM 设备节点沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 PWM 是很常用到功能,我们可以通过 PWM 来控制电机速度,也可以使用 PWM 来控制 LCD 的背光亮度。 一、什…

每日一题 2512. 奖励最顶尖的 K 名学生(中等,模拟,排序)

思路&#xff1a; 对于每一个学生的评价&#xff0c;使用 split 方法提取评价中的每一个字符&#xff0c;然后逐个判断是否是正面或者负面词汇来计算分数对id按照要求进行排序。为了加快字符的正负判断速度&#xff0c;先将 positive 和 negative 两个列表转化为 set 这样就可…

智能文件管理助手,轻松实现按数量平均分类文件,高效整理新文件夹!

在我们的电脑或移动设备中&#xff0c;文件管理是我们日常工作和生活中不可或缺的一部分。有时候&#xff0c;我们可能需要将一个文件夹中的大量文件按照数量平均分配到多个新的文件夹中&#xff0c;以便更好地进行整理和管理。现在&#xff0c;我们为您提供了一款智能文件管理…

JSAPI实现H5页面微信支付

进入官网文档&#xff1a;> 微信支付官网文档 根据官网文档能够很详细的需要做的事 接下来&#xff0c;采用的是JSAPI的方式在小程序嵌入H5页面中实现微信支付&#xff0c;直接拉起支付页面 一&#xff1a;需要在微信公众号平台和微信支付商家平台获取的配置的关键参数如下…

MidJourney | AI绘画也有艺术

免费绘画&#xff0c;体验更多AI可关&注公&众&号&#xff1a;AI研究工厂

ICPC 2019-2020 North-Western Russia Regional Contest

A (codeforces.com) 这题在移动不被挡板挡住以及不超过边界的情况下&#xff0c;每次走的越多那么次数就越少 只要两个每次都走b-a步&#xff08;已经是不被挡板挡住走的最多了&#xff09;&#xff0c;就不用考虑被挡板挡住的情况&#xff0c;只用单独考虑了&#xff0c;如果…

算法通过村第十三关-术数|黄金笔记|数论问题

文章目录 前言辗转相除法素数和合数埃氏筛选法丑数问题总结 前言 提示&#xff1a;难过的人伤心的人、在生活里面对困境的人、即将抑郁的人、从外面很难看出异样&#xff0c;人的心里却可能有一些裂痕。只是人不会再表面裂开。 --栾颖新《那个苹果也很好》 数论是一个很重要的学…

Stable diffusion 用DeOldify给黑白照片、视频上色

老照片常常因为当时的技术限制而只有黑白版本。然而现代的 AI 技术,如 DeOldify,可以让这些照片重现色彩。 本教程将详细介绍如何使用 DeOldify 来给老照片上色。. 之前介绍过基于虚拟环境的 基于DeOldify的给黑白照片、视频上色,本次介绍对于新手比较友好的在Stable diff…

2023年中国非血管介入手术无源耗材发展现状、竞争格局及行业市场规模[图]

非血管介入手术是指通过人体自然腔道或通过人体的小切口接近病灶而无需进入血管系统的微创手术&#xff0c;内窥镜、有源医疗器械及无源耗材则是该手术中最常用的医疗器械。非血管介入手术无源耗材主要包括导丝、球囊导管、取石网篮、封堵导管及鞘管。 非血管介入手术无源耗材…

LeetCode【739】每日温度

题目&#xff1a; 思路&#xff1a; https://www.bilibili.com/video/BV1PJ411H7P7/?spm_id_from333.337.search-card.all.click&vd_source2f682a60feabf0f730ad09e0f980ce83 单调栈 思考&#xff1a; 解决栈类问题&#xff0c;思考入栈&#xff0c;出栈条件&#xff1b;…

vue设置页面超时15分钟自动退出登录

需求&#xff1a;用户登录后&#xff0c;如果长时间未操作页面这个时候需要自动退出登录回到登录页面。 注意点&#xff1a;这里我们如果把超时的时间放到浏览器里面存储&#xff0c;我们要放到本地存储里面localStorage里面 Vue设置长时间未操作登录以后自动到期返回登录页 …

重生奇迹MU玛雅宝石的获取方法

在打斗游戏中重生奇迹MU游戏最好玩&#xff0c;并且游戏里面有很多的宝石&#xff0c;比如玛雅宝石、灵魂宝石以及创造宝石等等&#xff0c;这些宝石的作用非常强大&#xff0c;玩家必须要懂得如何利用这些宝石。 那么是否了解玛雅宝石呢&#xff0c;玛雅宝石应该算是最经典的…

为什么选择虚拟展会展览?了解虚拟展会展览的应用领域

引言&#xff1a; 相较于传统的实体展览&#xff0c;虚拟展会展览具有吸引力和便捷性&#xff0c;能够在全球范围内进行宣传活动。这种创新形式不仅能够降低成本、扩大受众范围&#xff0c;还能够提供没有过的互动性和数据分析。 一&#xff0e;虚拟展会展览简介 虚拟展会展览…