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

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

ztj100 2024-12-03 20:03 19 浏览 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登录鉴权的具体实施方案,有兴趣的朋友可以关注我。

相关推荐

其实TensorFlow真的很水无非就这30篇熬夜练

好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...

交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...

机器学习交叉验证全指南:原理、类型与实战技巧

机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...

深度学习中的类别激活热图可视化

作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

机器学习入门教程-第六课:监督学习与非监督学习

1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...

Python教程(三十八):机器学习基础

...

Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置

你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...

超全面讲透一个算法模型,高斯核!!

...

神经网络与传统统计方法的简单对比

传统的统计方法如...

AI 基础知识从0.1到0.2——用“房价预测”入门机器学习全流程

...

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...

苹果AI策略:慢哲学——科技行业的“长期主义”试金石

苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...

时间序列预测全攻略,6大模型代码实操

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...

AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN

...

取消回复欢迎 发表评论: