认识并使用JWT

认识并使用JWT

  • 一、互联网世界的用户认证
  • 二、对JWT的基本认知
  • 三、JWT的原理
    • 1 Header
    • 2 Payload
    • 3 Signature
    • 4 [参考资料](https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html)
  • 四、使用JWT
    • 1、引入依赖
    • 2、jwt的生成与解析
    • 3、测试
      • 3.1 生成jwt
      • 3.2 解析jwt

一、互联网世界的用户认证

  • 以调用openai的api为例:
curl https://api.openai.com/v1/chat/completions   -H "Content-Type: application/json"   -H "Authorization: Bearer $OPENAI_API_KEY"   -d '{"model": "gpt-3.5-turbo","messages": [{"role": "system","content": "You are a poetic assistant, skilled in explaining complex programming concepts with creative flair."},{"role": "user","content": "Compose a poem that explains the concept of recursion in programming."}]}'
  • Authorization: Bearer $OPENAI_API_KEY,其中$OPENAI_API_KEY便是用于用户认证的token。
  • 那用户怎么获取这个token呢?
    一般,咱先通过用户名和密码登录网站,然后网站分配一个token。
  • 在Java中,有JWT技术来实现这种需求。

二、对JWT的基本认知

  • JWT:JSON Web Token

我理解:将json格式的数据转换为在Web中用于用户认证的token。

  • JWT是一种基于Token的用户认证技术。
  • 思路:当用户登录时,服务器会创建一个包含用户信息的JWT,并将其发送回用户。然后,用户可以使用该Token来进行后续的授权请求。在每次请求中,服务器都会验证JWT来确认用户的身份,然后才会处理请求。

三、JWT的原理

  • JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
    在这里插入图片描述

1 Header

  • Header 部分原本是一个 JSON 对象,用于描述 JWT 的元数据,如下所示:
{"alg": "HS256","typ": "JWT"
}

(1)alg属性表示签名的算法,默认是 HMAC SHA256(写成 HS256);
(2)typ属性表示这个令牌(token)的类型,JWT统一写为"JWT"。

2 Payload

  • Payload 部分原本也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。

(1) iss (issuer):签发人
(2)exp (expiration time):过期时间
(3)sub (subject):主题
(4)aud (audience):受众
(5)nbf (Not Before):生效时间
(6)iat (Issued At):签发时间
(7)jti (JWT ID):编号

除了官方字段,咱还可以在这个部分定义私有字段,如下所示:

{"name": "Forrest","admin": true
}

注意:不要把秘密信息放在这个JSON对象中,因为通常这个JSON对象被转换为字符串后,默认是不加密的,这就会被别人解析回JSON对象,里面的信息就暴露了。

3 Signature

  • Signature 部分是对前两部分的签名,防止数据篡改。
  • 首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名:
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)
  • 算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。

4 参考资料

四、使用JWT

1、引入依赖

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
  • 还必须引入:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.11.3</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.3</version>
</dependency>

否则,会报错:
java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/JacksonFeature
at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:656)
at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:558)

2、jwt的生成与解析

public class JwtUtils {private static final String secret = "IntelliJ IDEA";// 7天有效期public static final long EXPIRE_TIME = 1000 * 60 * 60 * 24 * 7;/*** 生成jwt*/public static String encode(Map<String, Object> headerMap, Map<String, Object> playloadMap)  {return Jwts.builder().setHeader(headerMap).setClaims(playloadMap).signWith(SignatureAlgorithm.HS256, secret).compact();}/*** 解析jwt*/public static Map<String, Object> decode(String jwt) {return Jwts.parser().setSigningKey(secret).parseClaimsJws(jwt).getBody();}
}

3、测试

3.1 生成jwt

@Test
public void testEncode() {Map<String, Object> headerMap = new HashMap<>();headerMap.put("type", "JWT");headerMap.put("alg", "HS256");Map<String, Object> playloadMap = new HashMap<>();playloadMap.put("username", "Forrest");playloadMap.put("exp", System.currentTimeMillis() + JwtUtils.EXPIRE_TIME);playloadMap.put("jti", UUID.randomUUID().toString());for (Map.Entry<String, Object> entry : playloadMap.entrySet()) {System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());}String jwt = JwtUtils.encode(headerMap, playloadMap);System.out.println(jwt);
}

Key = exp, Value = 1706023265921
Key = jti, Value = c212fde2-abf4-4149-9c48-c55c1a029e79
Key = username, Value = Forrest
eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJleHAiOjE3MDYwMjMyNjU5MjEsImp0aSI6ImMyMTJmZGUyLWFiZjQtNDE0OS05YzQ4LWM1NWMxYTAyOWU3OSIsInVzZXJuYW1lIjoiRm9ycmVzdCJ9.t-rnO5CgC5DuNShsWIHxu_HKAgIU75tDQnlDcIBCmm0

3.2 解析jwt

@Test
public void testDecode() {String jwt = "eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJleHAiOjE3MDYwMjI3MzM2MTUsImp0aSI6ImFkMTRiZDEyLWNlN2EtNDBjNi1iYTJkLWU0MDllMTY4ZjIwYyIsInVzZXJuYW1lIjoiRm9ycmVzdCJ9.NuNW5PckkwWpFRobreKjrU6pDdosHnc3J2KhwxFW4xU";Map<String, Object> map = JwtUtils.decode(jwt);for (Map.Entry<String, Object> entry : map.entrySet()) {System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());}
}

Key = exp, Value = 1706023265921
Key = jti, Value = c212fde2-abf4-4149-9c48-c55c1a029e79
Key = username, Value = Forrest

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

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

相关文章

DataXCloud部署与配置[智数通]

静态IP设置 # 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33# 修改文件内容 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic IPADDR192.168.18.130 NETMASK255.255.255.0 GATEWAY192.168.18.2 DEFROUTEyes IPV4_FAILURE_FATALno IPV6INIT…

Pytorch各种Dropout层应用于详解

目录 torch框架Dropout functions详解 dropout 用途 用法 使用技巧 参数 数学理论公式 代码示例 alpha_dropout 用途 用法 使用技巧 参数 数学理论公式 代码示例 feature_alpha_dropout 用途 用法 使用技巧 参数 数学理论 代码示例 dropout1d 用途 用…

Spring 整合Shiro鉴权授权

一、什么是Shiro shiro是apache的一个开源框架&#xff0c;是一个权限管理的框架&#xff0c;实现 用户认证、用户授权。spring中有spring security &#xff0c;是一个权限框架&#xff0c;它和spring依赖过于紧密&#xff0c;没有shiro使用简单。 shiro不依赖于spring&#…

SQL实践:利用tag检索文件的多种情况讨论(二)

在上一篇文章SQL实践&#xff1a;利用tag检索文件的多种情况讨论中&#xff0c;我们介绍了在使用外键的方式为数据关联tag后&#xff0c;如何筛选&#xff1a; 如何筛选包含某一个tag的数据如何筛选包含且只包含某一个tag的数据如何筛选包含多个指定tag的数据 这篇文章主要是…

Linux 网口配置文件及网络服务

本篇记录Linux 的网卡配置以及网络服务的相关配置&#xff0c;期望在了解的网卡的配置内容的基础上&#xff0c;对网络问题能进行配置文件的排查。网络问题是非常复杂的&#xff0c;本篇不涉及抓包和网络的其他问题排查。 一、网络配置文件 网络配置文件有很多&#xff0c;常见…

eNSP学习——终端直连三层网关设备进行通信

VLAN 配置 一 . 功能简介 将设备中的某些接口定义为一个单独的区域&#xff0c;将指定接口加入到指定 VLAN 中之后&#xff0c;接口就可以转发 指定 VLAN 报文。从而实现 VLAN 内的主机可以直接通信&#xff0c;而 VLAN 间的主机不能直接互通&#xff0c;将广播报文 …

element-ui tree树形结构全选、取消全选,展开收起

控制树形结构全选、取消全选&#xff0c;展开收起 <template><div><!-- 添加 ref"tree" 属性--><el-tree:data"data"show-checkboxdefault-expand-allnode-key"id"ref"tree"highlight-current:props"defa…

【LeetCode】18. 四数之和(中等)——代码随想录算法训练营Day07

题目链接&#xff1a;18. 四数之和 题目描述 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四…

深入底层了解Python字典和集合,一眼看穿他们的本质!

Python中的字典&#xff08;dict&#xff09;和集合&#xff08;set&#xff09;是两个强大且常用的数据结构&#xff0c;它们在处理数据和解决问题时发挥着重要作用。深入了解这两种数据结构的底层实现和用法将有助于编写更高效、灵活和可读性强的代码。 Python字典&#xff…

vue element 修改dialog 关闭按钮颜色

.el-dialog__headerbtn .el-dialog__close, .el-dialog__headerbtn:focus .el-dialog__close, .el-dialog__headerbtn:hover .el-dialog__close {color: white; }

详解SpringCloud微服务技术栈:Feign远程调用、最佳实践、错误排查

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;Nacos配置管理 &#x1f4da;订阅专栏&#xff1a;微服务技术全家桶 希望文章对你们有…

Python src/pyaudio/device_api.c:9:10: fatal error: portaudio.h: 没有那个文件或目录

在安装Pyaudio的时候报错&#xff0c;portaudio.h: 没有那个文件或目录&#xff0c;解决办法如下&#xff1a; sudo apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0 安装Pyaudio pip install PyAudio -i https://mirrors.bfsu.edu.cn/pypi/…

积木游戏

题目描述 小云和小吉在玩积木游戏&#xff0c;他们手上有很多积木&#xff0c;每个积木上面都有一个字母。 现在他们把所有的积木都排在一条队列上&#xff0c;队列有一个完美值&#xff0c;这个完美值就是积木队列上的字母组成的字符串的字典序&#xff0c;字典序越大完美值…

MyBatis - DAO 接口(Mapper.xml)支持方法重载吗?

方法重载&#xff08;Method Overloading&#xff09;是指在同一个类中定义多个方法&#xff0c;它们具有相同的方法名但参数列表不同。 Dao 在 MyBatis 的 DAO 层接口中&#xff0c;是允许方法重载的。 在 DAO 层接口中&#xff0c;可以根据不同的需求和条件定义多个方法&am…

蓝桥杯青少年创意编程大赛:激发少儿编程潜能,培养未来科技之星

随着科技的飞速发展&#xff0c;编程已经成为了当今世界的一项重要技能。为了培养更多的编程人才&#xff0c;蓝桥杯官网显示&#xff0c;蓝桥杯青少年创意编程大赛应运而生。作为国内有影响力的少儿编程赛事之一&#xff0c;蓝桥杯青少年创意编程大赛旨在激发青少年对编程的兴…

​Portkey AI网关:一个用来连接多种人工智能模型的开源工具

简介 它允许开发者通过一个简单的API接口来访问超过100种不同的大语言模型。包括OpenAI、Anthropic、Mistral、LLama2、Anyscale、Google Gemini等。安装体积只有45kb&#xff0c;处理速度提升了9.9倍&#xff0c;可以在多个不同的AI模型中来回切换。可以根据自己的需要进行灵…

找不到mfc100.dll的解决方法,怎么修复mfc100.dll文件

当我们在使用电脑时&#xff0c;时常可能会遇到各类系统提示的错误信息。"找不到mfc100.dll" 就是这些错误之一&#xff0c;该错误提示会妨碍我们执行一些应用程序或特定代码。为了帮助读者克服这个技术障碍&#xff0c;本篇文章将详尽阐明导致该问题的根本原因&…

【Flutter 问题系列第 80 篇】TextField 输入框组件限制可输入的最大长度后,输入的内容中包含表情符号时,获取输入的内容数还是会超出限制的问题

这是【Flutter 问题系列第 80 篇】&#xff0c;如果觉得有用的话&#xff0c;欢迎关注专栏。 博文当前所用 Flutter SDK&#xff1a;3.10.5、Dart SDK&#xff1a;3.0.5 一&#xff1a;问题描述 在输入用户名称、简介等内容时&#xff0c;一般我们都会限制输入框内最大可输入…

The Feast and the Bus

JebTrains的员工正在庆祝一年中的第256天&#xff01;JebTrains有 n 名员工和 k 个团队。每个员工都是某个&#xff08;恰好是一个&#xff09;团队的成员。所有队伍的编号从 1 到 k。您将得到一个数字数组 t1、t2、…、tn&#xff0c;其中ti是第i个员工的团队编号。 JebTrains…

FFMPEG解码实时流,支持cpu、gpu解码

官网下载的ffmpeg目前只能下载到X64版本的库&#xff0c;具体编译请参考windows编译ffmpeg源码&#xff08;32位库&#xff09;_windows 32位ffmpeg动态库-CSDN博客 直接上代码 int VideoDecodeModule::Open(std::string strUrl) {AVFormatContext *pFormatCtx nullptr;AVCo…