百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

JWT生成Token及JWT令牌验证详解

ztj100 2024-12-03 20:03 12 浏览 0 评论

JWT 即Json Web Token的简称,它是一种将用户登录状态以及数据用经过加密的json格式存储在客户端,用户的每次请求都会把该json字符串发送到服务端,服务端从而能对用身份进行鉴别的方案,简单来说,JWT一种用户身份认证的解决方案。

JWT身份认证相比于其他身份认证方案有如下几个优点:

一、JWT优点:

1、无状态,易扩展,适合分布式应用;

2、可以把用户身份验证信息所需信息存储在本地,而服务端则可以不用存储用户信息即可进行身份验证。

jwt身份认证方法虽然,但是其也有缺点的,其具有如下几个缺点:

1、JWT令牌较长,占用用户本地存储空间比较大,而且也增加了传输载荷;

2、因为JWT的无状态性,在服务端对用户的身份进行更改后,无法立即生效,需要等到token有效期过后才能生效;

二、JWT具体实施方案

在开源平台有很多JWT插件,各种语言的版本都有,比如PHP的有php-jwt,JAVA有java-jwt等,这些插件可以自行到GitHub搜索下载,所以我们使用JWT进行身份认证时完全无需自己写jwt实现模块。

不管哪种语言的JWT实现方案,其原理基本一致,一个简单的JWT类通常会包含如下三个部分,如下以php-jwt为例给大家介绍下:

1、token配置项:

$token = [

'iss' => '', //签发者 可选

'aud' => '', //接收该JWT的一方,可选

'exp' => 7200, //过期时间,这里设置2个小时

'data' => $data//需要传递的用户身份信息,比如用户ID等

];

2、加密方法:

JWT::encode($token, 'jwt加密秘钥', 'HS256');

//该方法有三个参数,第一个就是token配置参数,第二个就是jwt加密秘钥,该参数视情况配置,越复杂安全性越高,第三个参数就是jwt加密方式,默认为'HS256'密码方式,该方法返回类似如下的一段JSON字符串(jwt令牌):

yJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwia656WEW665M5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_IOkrer4

3、验证方法

JWT::decode('jwt令牌', new Key('jwt加密秘钥', 'HS256'));

//该方法用来验证客服端传递给服务器的JSON字符串(token令牌),该方法的第一个参数为客服端传递给服务器的JSON字符串(token令牌),第二个参数中的jwt加密秘钥和jwt加密方式必须要和加密方法中的参数完全一致,否则会导致验证失败。

简单来说,JWT身份验证流程是通过加密方法把客户信息、加密密钥、密钥的过期时间等采用指定的加密方式比如HS256进行加密后生成一段JSON字符串(token令牌),然后把该字符串返回给客户端,客户端通常采用cookie、localStorage或者sessionStorage保存到本地,以后客户每次请求都会通过header把该token令牌传递给服务器,服务器使用验证方法(该验证方法会先对token令牌进行分割,把里面的过期时间分割出来,先验证该令牌是否过期,如果没有过期,则采用相同的参数生成一个token令牌和客户端传递过来的令牌进行对比,如果二者一致则验证通过,如果不一致则代表该令牌为伪造)进行验证,假如该jwt令牌验证通过就代表该客户为合法登录的用户,这样就能保持该客户的登录状态了。

那么在客户端怎么通过header把token令牌传递给服务器呢?请看如下实例:

$.ajax({
headers: {
'Authorization': 'token令牌'
},
type: 'POST',
url: url,

data: data,
success: function (data) {
},
})

从上述代码可以看出,前端通过ajax或axios和前台接口进行交互时,是通过headers 的'Authorization'属性,把本地获取到的'token令牌'提交给后台进行鉴权的。

综上所述,一个简单的JWT token验证过程,包含token参数配置、token生成和验证,在实际应用中,token参数配置还可以配置客户端IP是否绑定,绑定了IP的token令牌安全性更高。

虽然JWT生成的token加密方式都比较成熟,但是JWT加密密钥过于简单的话,黑客还是可能伪造token的,所以为了系统的安全性,JWT加密不能过于简单,越复杂安全性越高。在token令牌传输过程中,务必使用https传送,以免被人截获从而造成用户身份被劫持。

下一章节给大家具体介绍下JWT登录鉴权的具体实施方案,有兴趣的朋友可以关注我。

相关推荐

电脑装系统用GHOST好,还是原装版本好?老司机都是这么装的

Hello大家好,我是兼容机之家的咖啡。安装Windows系统是原版ISO好还是ghost好呢?针对这个的问题,我们先来科普一下什么是ghost系统,和原版ISO镜像两者之间有哪些优缺点。如果是很了解...

苹果 iOS 14.5.1/iPadOS 14.5.1 正式版发布

IT之家5月4日消息今日凌晨,苹果发布了iOS14.5.1与iPadOS14.5.1正式版更新。这一更新距iOS14.5正式版发布过去了一周时间。IT之家了解到,苹果表示,...

iOS 13.1.3 正式版发布 包含错误修复和改进

苹果今天发布了iOS13.1.3和iPadOS13.1.3,这是iOS13发布之后第四个升级补丁。iOS13.1.2两周前发布。iOS13.1.3主要包括针对iPad和...

还不理解 Error 和 Exception 吗,看这篇就够了

在Java中的基本理念是结构不佳的代码不能运行,发现错误的理想时期是在编译期间,因为你不用运行程序,只是凭借着对Java基本理念的理解就能发现问题。但是编译期并不能找出所有的问题,有一些N...

Linux 开发人员发现了导致 MacBook“无法启动”的 macOS 错误

“多个严重”错误影响配备ProMotion显示屏的MacBookPro。...

启动系统时无法正常启动提示\windows\system32\winload.efi

启动系统时无法正常启动提示\windows\system32\winload.efi。该怎么解决?  最近有用户遇到了开机遇到的问题,是Windows未能启动。原因可能是最近更改了硬件或软件。虽然提...

离线部署之两种构建Ragflow镜像的方式,dify同理

在实际项目交付过程中,经常遇到要离线部署的问题,生产服务器无法连接外网,这时就需要先构建好ragflow镜像,然后再拷到U盘或刻盘,下面介绍两种构建ragflow镜像的方式。性能测试(网络情况好的情况...

Go语言 error 类型详解(go语言 异常)

Go语言的error类型是用于处理程序运行中错误情况的核心机制。它通过显式的返回值(而非异常抛出)来管理错误,强调代码的可控性和清晰性。以下是详细说明及示例:一、error类型的基本概念内置接口...

Mac上“闪烁的问号”错误提示如何修复?

现在Mac电脑的用户越来越多,Mac电脑在使用过程中也会出现系统故障。当苹果电脑无法找到系统软件时,Mac会给出一个“闪烁的问号”的标志。很多用户受到过闪烁问号这一常见的错误提示的影响,如何解决这个问...

python散装笔记——177 sys 模块(python sys模块详解)

sys模块提供了访问程序运行时环境的函数和值,例如命令行参数...

30天自制操作系统:第一天(30天自制操作系统电子书)

因为咱们的目的是为了研究操作系统的组成,所以直接从系统启动的第二阶段的主引导记录开始。前提是将编译工具放在该文件目录的同级目录下,该工具为日本人川合秀实自制的编译程序,优化过的nasm编译工具。...

五大原因建议您现在不要升级iOS 13或iPadOS

今天苹果放出了iPadOS和iOS13的公测版本,任何对新版功能感兴趣的用户都可以下载安装参与测试。除非你想要率先体验Dark模式,以及使用AppleID来登陆Facebook等服务,那么外媒CN...

Python安装包总报错?这篇解决指南让你告别pip烦恼!

在Python开发中,...

苹果提供了在M1 Mac上修复macOS重装错误的方案

#AppleM1芯片#在苹果新的M1Mac推出后不久,我们看到有报道称,在这些机器上恢复和重新安装macOS,可能会导致安装错误,使你的Mac无法使用。具体来说,错误信息如下:"An...

黑苹果卡代码篇三:常见卡代码问题,满满的干货

前言...

取消回复欢迎 发表评论: