JWT登录认证

news2024/11/15 6:42:26

JWT认证流程

跨域认证解决方案,JWT的流程为:

  1. 客户端发送账号和密码请求
  2. 服务端收到请求,验证用户名密码是否通过
  3. 验证成功后,服务端会生成唯一的token,将其返回给客户端
  4. 客户端收到token,会将其存储在cookie或者localStorage中
  5. 之后每一次客户端向服务端发送请求,都会通过cookie 或者header携带该token
  6. 服务端验证token的有效性,通过后才返回响应的数据
    在这里插入图片描述
    token 认证优点
  7. 支持跨域访问: cookie不允许跨域访问,
  8. . 无状态: token机制在服务端不需要存储session信息, token包含了所有登录用户的信息,在客户端的cookie活本地存储状态信息
  9. 适用性更广: http协议的客户端,都可以使用token认证
    10.不需要考虑csrf: 不再依赖cookie, 所以token不会发生csrf,无需考虑csrf防御

JWT结构:
一个jwt是一个字符串, 它由三部分组成: 头部、载荷、签名,中间用.分开。

在这里插入图片描述
头部/header
header由两部分组成: token的类型 jwt 和算法名称: HMAC、SHA256、RSA

{
	"alg": "HS256",
	"type": "JWT"
}

载荷 / Payload
Payload 是一个JSON对象,存放传递的数据。JWT有七个字段

1. iss: 发行人
2. exp: 到期时间
3. sub: 主题
4. aud: 用户
5. nbf: 在此之前不可用
6. iat: 发布时间
7. jti: JWT ID

除了默认的七个字段,还可以添加自己想要的任何字段。
payload: 存放用户登录成功后的信息

{
"iss": "xxx",
"sub": "xxx",
"aud": "xxx",
"user": [
	"userName": 'admin',
	'gender': 1,
	'nickname': 'a'
]}

签名/ signature
签名部分 对头部、载荷两部分数据进行的数据签名
为了保证不被篡改、要有一个密钥存放在服务端
生成签名的代码:

String signature = HMACSHA256(base64UrlEncode(header) + '.' + base64urlEncode(payload), secret)

JWT 基本使用
客户端收到服务端返回的JWT, 可以存储在Cookie里面,也可以存储在localStorage
客户端每次与服务器通信,都要带上JWT
把JWT保存在cookie里面发送请求, 不能跨域
放在http请求的头信息authrization字段

fetch('license/login', {
	headers: {
		'Authorization': 'X-TOKEN' + token
	}
})

代码实现

var token = jwt.sign({
    exp: Math.floor(Date.now() / 1000) + 60*60*24, // 设置JWT的过期时间为当前时间加一天
    name: data.person, // 设置JWT中的name字段为data.person的值
}, config.secret, function(err, token) { // 使用config.secret作为密钥对JWT进行签名
    res.json({ // 返回一个JSON响应
        msg: { // 响应中的msg字段
            status: 1, // 设置状态为1
            msg: "登录成功" // 设置消息为"登录成功"
        },
        data: { // 响应中的data字段
            token: token // 将生成的JWT作为token字段的值
        }
    })
})
// 验证jwt
new Promise(function(resolve, reject) {
    jwt.verify(token, config.secret, function(err, decoded) { // 使用config.secret对JWT进行验证
        if (err) { // 如果验证出错
            res.json({ // 返回一个JSON响应
                ok: 0, // 设置ok字段为0,表示验证失败
                msg: err // 设置msg字段为错误信息
            })
        } else { // 如果验证成功
            // 在这里可以对验证成功后的逻辑进行处理
        }
    })
})

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

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

相关文章

拓扑排序详解(带有C++模板)

目录 介绍: 实现原理: 简答来说: 例子 模板(C) 介绍: 拓扑排序(Topological Sorting)是一种针对有向无环图(DAG)的节点进行排序的算法。DAG是一个图&…

Android 之 使用 MediaRecord 录音

本节引言 本节是Android多媒体基本API调用的最后一节,带来的是MediaRecord的简单使用, 用法非常简单,我们写个例子来熟悉熟悉~ 1.使用MediaRecord录制音频 运行结果: 实现代码: 布局代码:activity_main.…

自动化测试如何做?真实企业自动化测试流程,自动化测试分类...

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

一文讲清楚地图地理坐标系

前言 我最近在做一个和地图有关的项目,这里本人地图采用的是mapbox,其中涉及一个功能需要根据用户输入的地点直接定位到地图上的对应的位置,本人开始想的是直接调用百度的接口根据地名直接获取坐标,发现在地图上的位置有偏移不够…

C++——模板的作用2:特例化

目录 模板的形式: 一.模板的多参数应用: 例: 错误使用1:使用不标准的模板形参表 ​编辑 错误使用2:使用变量作为实参传递给函数模板 二.模板的特例化: 类模板: 针对模板的特化步骤&am…

乌班图22.04安装wireguard实现异地组网

1. 前言: wireguard是新型的异地组网工具,在此之前,又已经被抛弃的pptp,l2tp,有配置复杂的openvpn,wireguard被linux作者linus赞叹优雅,于linux 5.6合并至linux内核主线。 2. 安装过程&#…

文心一言 VS 讯飞星火 VS chatgpt (68)-- 算法导论6.5 7题

文心一言 VS 讯飞星火 VS chatgpt (68)-- 算法导论6.5 7题 七、试说明如何使用优先队列来实现一个先进先出队列,以及如何使用优先队列来实现栈(队列和栈的定义见 10.1 节。) 文心一言: 优先队列是一种数据结构,其中…

干货|一次完整的性能测试,测试人员需要做什么?

作者介绍 邓宝菊(Kiki Deng),10 年软件测试经验,4 年团队管理经验,当前任职研发部架构质量工程部,整体负责研发部测试团队的效能、工具流程建设和人才培养。 前言 一、 规范性能测试实施流程的意义 规范…

Qt: 查看qmake相关参数设置

Qt开发中,经常会遇到qmake相关问题,比如同时安装了多个Qt版本的情况。比如我的情况是系统自带了Qt 5.12.8, 但是开发中遇到一些兼容性问题,于是又手动安装了5.9.8。 查看qmake版本,qmake -v, 虽然项目中已经指定了5.9.8, 但是系统…

通过String字符生成base64编码在生成图片

* base64转图片 //对字节数组字符串进行Base64解码并生成图片 * param base64str base64码 * return // param savePath 图片路径private static final String savePath"image_ver\\verifyCode"; 判断是否为base64编码 public static void mainDD…

关闭深度学习训练/推理进程的方法

引言 设想有一种情况,在ssh服务器训练/推理的时候,突然断线,再次打开ssh的时候,发现后台在运行,此时无法使用 ctrlc 终止,从而,可以用一个很简单的办法来结束:手动关闭进程。 方法 输…

python中如何记录日志?

日志是一种可以追踪某些软件运行时所发生事件的方法。一条日志信息对应的是一个事件的发生,而一个事件通常需要包括以下几个内容:事件发生时间、事件发生位置、事件的严重程度--日志级别、事件内容。 logging模块定义的函数和类为应用程序和库的开发实现…

Python-Python基础综合案例——数据可视化 - 动态柱状图

版本说明 当前版本号[20230729]。 版本修改说明20230729初版 目录 文章目录 版本说明目录知识总览图Python基础综合案例——数据可视化 - 动态柱状图案例效果基础柱状图通过Bar构建基础柱状图反转x和y轴将数值标签放在右侧 基础时间线柱状图创建时间线自动播放时间线设置主题…

基于FPGA的VGG16卷积神经网络加速器--WL

VGG16是一个典型的卷积神经网络,由13层卷积层,5层池化层和3层全连接层组成。且卷积层的计算时间在整个计算过程中占比极大,通过FPGA的并行运算可以有效的加快卷积层的计算速度。 一个卷积层可以有若干个卷积核,以第一层为例&#…

NetSuite 工单超额完工

用户问题 在报工时,完工数量能否超过工单上的计划数量? 解决方法 在制造相关的参数中,有一个参数控制: ALLOW OVERAGE ON WORK ORDER TRANSACTIONS •Check On允许超出工单计划数量 •Check Off不允许超出工单计划数量 Demo 工单计划数量…

前缀和拆分

前缀和 前缀和:一段序列里的前n项和 给出n个数,在给出q次问询,每次问询给出L、R,快速求出每组数组中一段L至R区间的和 给出一段数组,每次问询为求出l到r区间的和 普通方法:L到R进行遍历,那么…

Python-ElasticSearch客户端的封装(聚合查询、统计查询、全量数据)

目录 ES Python客户端介绍封装代码测试代码参考 ES Python客户端介绍 官方提供了两个客户端elasticsearch、elasticsearch-dsl pip install elasticsearchpip install elasticsearch-dsl第二个是对第一个的封装,类似ORM操作数据库,可以.filter、.group…

EverEdit的一些特殊使用教学(持续更新)

项目场景: EverEdit的使用经常一问三不知 搜也搜不到 解决方案: 先去EverEdit在线帮助文档看一下(附链接) EverEdit在线帮助文档 1.快速排序 使用快捷键时:若是小键盘,请同时按住fn键(在最左下角的ctrl旁)

220. 存在重复元素 III

220. 存在重复元素 III 原题链接:完成情况:解题思路:TreeSetsequenceSet.ceilingjava中的红黑树 参考代码: 原题链接: 220. 存在重复元素 III https://leetcode.cn/problems/contains-duplicate-iii/description/ 完…

ER系列路由器多网段划分设置指南

ER系列路由器多网段划分设置指南 - TP-LINK 服务支持 TP-LINK ER系列路由器支持划分多网段,可以针对不同的LAN接口划分网段,即每一个或多个LAN接口对应一个网段;也可以通过一个LAN接口与支持划分802.1Q VLAN的交换机进行对接,实现…