当前位置: 首页 > news >正文

JWT 技术的使用

应用场景:访问某些页面,需要用户进行登录,那我们如何知道用户有没有登录呢,这时我们就可以使用jwt技术。用户输入的账号和密码正确的情况下,后端根据用户的唯一id生成一个独一无二的token,并返回给前端,前端把token保存起来,每次发送请求,请求头携带一个token,以表示用户的身份。当然,后端也要进行校验,确保用户的token不是伪造和过期的。

下面举个例子,使用node搭建服务器来详细说明 jwt 的具体用法。

1.用户通过提供身份信息(如账号和密码)进行身份验证

在这里插入图片描述

2.服务器验证用户提供的身份信息,如果验证通过,则并生成一个token并返回给客户端

if (req.query["username"] && req.query["password"]) {const { password, username } = req.query;// 1. 根据用户名查找用户const user = await Admin.findOne({ username }).select("+password");// 如果用户名没找到if (!user) return resp.send({ code: 422, message: "用户不存在!" });// 2. 校验密码(比较明文和密文的密码)const isTrue = require("bcryptjs").compareSync(password, user.password);// 如果密码错误,则抛出错误状态码和错误信息if (!isTrue) return resp.send({ code: 422, message: "密码错误!" });// 3. 返回token值(利用公钥加密用户的唯一id,得到token值,并且设置了过期时间为2小时)const token = jwt.sign({ id: user._id }, app.SECRET, { expiresIn: "2h" });// 查找用户信息const userInfo = await Admin.find({ username: req.query.username }).sort({timeStamp: -1,});// 成功生成 JWT,将 JWT 返回给客户端resp.setHeader("Access-Control-Allow-Origin", "*");resp.setHeader("Access-Control-Expose-Headers", "Authorization");resp.setHeader("Authorization", `Bearer ${token}`);return resp.send({ token, code: 200, userInfo });}

3.客户端将 token 保存到本地中

//设置响应拦截器instance.interceptors.response.use((res) => {if (res.headers.authorization) { const token = res.headers.authorization.split(" ")[1]console.log('token',token);localStorage.setItem('token',token)}// 拦截后需要将拦截下来处理成的结果返回return res.data;},(err) => {console.log(err);});

4.在后续请求中将 token 放在请求的头部,以表示用户的身份

// 请求拦截器instance.interceptors.request.use((config) => {// 将token拿出来,拼接到请求头上const token = localStorage.getItem("token");if (token) {config.headers.Authorization = `Bearer ${jwt}`;}//请求成功的函数return config;},(err) => {return err;});

5.服务器在接收到请求时,验证 token 的有效性,并根据其中的信息进行授权和验证。

// 判断用户token是否合法router.get("/verify", async (req, resp) => {const { token } = req.query;console.log(token);**// 如果token是伪造的,则直接抛出异常try {const obj = jwt.verify(token, app.SECRET);console.log(obj);// obj.exp 是过期的时间(单位为s)if (Date.now() >= obj.exp * 1000) {resp.send({ code: 401, message: "无效的JWT令牌" });} else { resp.send({ code: 200, message: "success" });}} catch (error) {resp.send({ code: 401, message: "无效的JWT令牌" });}});

相关文章:

JWT 技术的使用

应用场景:访问某些页面,需要用户进行登录,那我们如何知道用户有没有登录呢,这时我们就可以使用jwt技术。用户输入的账号和密码正确的情况下,后端根据用户的唯一id生成一个独一无二的token,并返回给前端&…...

机器学习深度学习——NLP实战(自然语言推断——微调BERT实现)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——针对序列级和词元级应用微调BERT 📚订阅专栏:机器学习&&深度学习 希望文…...

如何在windows下使用masm和link对汇编文件进行编译

前言 32位系统带有debug程序,可以进行汇编语言和exe的调试。但真正的汇编编程是“编辑汇编程序文件(.asm)->编译生成obj文件->链接生成exe文件”。下面,我就来说一下如何在windows下使用masm调试,使用link链接。 1、下载相应软件 下载…...

Golang字符串基本处理方法

Golang的字符串处理 字符串拼接 两种方法&#xff1a;strings.Join方法和’方法 package mainimport ("fmt""strings" )func main() {num : 20strs : make([]string, 0)for i : 0; i < num; i {strs append(strs, "fht")}//string.join拼…...

算法训练营第三十九天(8.30)| 动态规划Part09:购买股票

Leecode 123.买卖股票的最佳时机 III 123.买卖股票的最佳时机III 123.买卖股票的最佳时机III 题目地址&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目类型&#xff1a;股票问题 class Solution { public:int maxProfit(vector<…...

renren-fast-vue环境升级后,运行正常打包后,访问页面空白

网上各种环境&#xff0c;路径都找了一遍&#xff0c;也没成功。后来发现升级后打包的dist文件结构发生了变化&#xff0c; 1.最开始正常版本是这样 2.升级后是这样&#xff0c;少了日期文件夹 3.问题&#xff1a;打包后的index.html中引入的是config文件夹&#xff0c;而打…...

Uniapp笔记(三)uniapp语法2

一、本节项目预备知识 1、组件生命周期 1.1、什么是生命周期 生命周期(Life Cycle)是指一个对象从创建-->运行-->销毁的整个阶段&#xff0c;强调的是一个时间段 我们可以把每个uniapp应用运行的过程&#xff0c;也概括为生命周期 小程序的启动&#xff0c;表示生命周…...

windows【ftp-FTP】添加配置流程【iis服务】

第一步&#xff1a;自己安装iis服务和ftp服务【自己百度搜索】 第二步&#xff1a;添加ftp站点【配置主动端口默认为21】 第三方配置&#xff1a;ftp被动端口【这里设置为3000-4000】请在防火墙开放此端口【如果是阿里云请在阿里云的后天也开通此端口】【护卫神一般使用55000…...

mysql视图的创建和选项配置详解

在 MySQL 中&#xff0c;可以使用 CREATE VIEW 语句来创建视图。基本的语法如下&#xff1a; CREATE[OR REPLACE][ALGORITHM {UNDEFINED | MERGE | TEMPTABLE}][DEFINER {user | CURRENT_USER}][SQL SECURITY { DEFINER | INVOKER }]VIEW view_name [(column_list)]AS selec…...

Python正则表达式中re.sub自定义替换方法正确使用方法

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 话不多说&#xff0c;直接开搞&#xff0c;如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 在使用正则替换时&#xff0c;有时候需要将匹配的结果做对应处理&#xff0c;便可以使用自定义替换方法。 re.sub的用法为&…...

hyperf 十五 验证器

官方文档&#xff1a;Hyperf 验证器报错需要配合多语言使用&#xff0c;创建配置自动生成对应的语言文件。 一 安装 composer require hyperf/validation:v2.2.33 composer require hyperf/translation:v2.2.33php bin/hyperf.php vendor:publish hyperf/translation php bi…...

ssh访问远程宿主机的VMWare中NAT模式下的虚拟机

1.虚拟机端配置 1.1设置虚拟机的网络为NAT模式 1.2设置虚拟网络端口映射(NAT) 点击主菜单的编辑-虚拟网络编辑器&#xff1a; 启动如下对话框&#xff0c;选中NAT模式的菜单项&#xff0c;并点击NAT设置&#xff1a; 点击添加&#xff0c;为我们的虚拟机添加一个端口映射。…...

【一等奖方案】大规模金融图数据中异常风险行为模式挖掘赛题「NUFE」解题思路

第十届CCF大数据与计算智能大赛&#xff08;2022 CCF BDCI&#xff09;已圆满结束&#xff0c;大赛官方竞赛平台DataFountain&#xff08;简称DF平台&#xff09;正在陆续释出各赛题获奖队伍的方案思路&#xff0c;欢迎广大数据科学家交流讨论。 本方案为【大规模金融图数据中…...

npm install 报错

npm install 报错 npm install 报错 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: yudao-ui-admin1.8.0-snapshot npm ERR! Found: eslint7.15.0 npm ERR! node_modules/eslint npm ERR! dev eslint&q…...

专业人士使用的3个好用的ChatGPT提示

AI正在席卷世界。从自动化各个领域的任务到几秒钟内协助我们的日常生活&#xff0c;它有着了公众还未理解的巨大价值……除非你是专业人士。 专业人士一般都使用什么提示以及如何使用的&#xff1f;这里是经验丰富的懂ChatGPT的专业人士才知道的3个提示。好用请复制收藏。 为…...

doris系列2: doris分析英国房产数据集

1.准备数据 2.doris建表 CREATE TABLE `uk_price_paid` (`id` varchar(50) NOT NULL,`price` int(20),`date` date...

精准运营,智能决策!解锁天翼物联水利水务感知云

面向智慧水利/水务数字化转型需求&#xff0c;天翼物联基于感知云平台创新能力&#xff0c;提供涵盖水利水务泛协议接入、感知云水利/水务平台、水利/水务感知数据治理、数据看板在内的水利水务感知云服务&#xff0c;构建水利水务感知神经系统新型数字化底座&#xff0c;实现智…...

CleanMyMac最新版4.14Mac清理软件下载安装使用教程

苹果电脑是很多人喜欢使用的一种电脑&#xff0c;它有着优美的外观&#xff0c;流畅的操作系统&#xff0c;丰富的应用程序和高效的性能。但是&#xff0c;随着时间的推移&#xff0c;苹果电脑也会产生一些不必要的文件和数据&#xff0c;这些文件和数据就是我们常说的垃圾。那…...

String.Format方法详解

在Java中&#xff0c;String.format() 方法可以用于将格式化的字符串写入输出字符串中。该方法将根据指定的格式字符串生成一个新的字符串&#xff0c;并使用可选的参数填充格式字符串中的占位符。以下是有关 String.format() 方法的更详细信息&#xff1a; 语法 public stati…...

【Mysql】关联查询1对多处理

关联查询1对多返回 遇见的问题 审批主表&#xff0c;和审批明细表&#xff0c;一张审批对应多张明细数据&#xff0c;每条明细数据的状态是不一样的&#xff0c;现在需要根据明细的状态获取到主单子的状态&#xff0c;状态返回矩阵如下 明细状态返回总状态都是已完成已完成都…...

像素皇城·灵蛇贺岁实战案例:高校AI课程中像素春联生成器教学项目设计

像素皇城灵蛇贺岁实战案例&#xff1a;高校AI课程中像素春联生成器教学项目设计 1. 项目背景与教学价值 在高校AI课程教学中&#xff0c;如何将传统文化与现代技术相结合&#xff0c;设计出既有教育意义又富有趣味性的实践项目&#xff0c;一直是教学设计的难点。"像素皇…...

Fish Speech 1.5开源可部署:模型权重分离存储与热更新机制设计

Fish Speech 1.5开源可部署&#xff1a;模型权重分离存储与热更新机制设计 1. 引言&#xff1a;语音合成的新突破 当你听到一段自然流畅的语音&#xff0c;是否曾想过它可能完全由AI生成&#xff1f;Fish Speech 1.5正是这样一个令人惊叹的技术成果——它能够仅凭10-30秒的参…...

LabVIEW 2018+ 也能玩转OpenCV了?手把手教你用秣厉科技工具包实现摄像头人脸识别

LabVIEW与OpenCV的跨界融合&#xff1a;零代码实现工业级视觉检测方案 当图形化编程遇上计算机视觉&#xff0c;会碰撞出怎样的火花&#xff1f;对于习惯了LabVIEW数据流编程的工程师来说&#xff0c;OpenCV那些复杂的矩阵运算和算法实现往往令人望而生畏。而现在&#xff0c;…...

Qt Network 模块中的 TCP/IP 网络编程详解

Qt 是一个功能强大的跨平台 C 框架&#xff0c;其 Qt Network 模块为应用程序提供了丰富的网络通信能力&#xff0c;极大地简化了网络编程的复杂性。在众多网络协议中&#xff0c;TCP/IP 协议栈是互联网通信的基础&#xff0c;Qt Network 提供了 QTcpSocket 和 QTcpServer 等类…...

Leather Dress Collection 企业级参数调优指南:平衡响应速度与生成质量

Leather Dress Collection 企业级参数调优指南&#xff1a;平衡响应速度与生成质量 如果你正在考虑把Leather Dress Collection这类大模型服务搬到公司的生产环境里&#xff0c;那你肯定遇到过这样的纠结&#xff1a;调快了&#xff0c;生成的内容质量好像会打折扣&#xff1b…...

LeetCode 11. Container With Most Water 题解

LeetCode 11. Container With Most Water 题解 题目描述 给你 n 个非负整数 a1&#xff0c;a2&#xff0c;...&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条…...

如何通过InstantClick事件回调实现精准的性能监控:开发者必备指南

如何通过InstantClick事件回调实现精准的性能监控&#xff1a;开发者必备指南 【免费下载链接】instantclick InstantClick makes following links in your website instant. 项目地址: https://gitcode.com/gh_mirrors/in/instantclick InstantClick是一款能让网站链接…...

【Oracle篇】基于OGG 21c全程图形化实现9TB数据从Oracle 11g到19c的不停机迁移(上):微服务架构详解与微服务部署,及同步问题总览(第一篇,总共三篇)

&#x1f4ab;《博主主页》&#xff1a;    &#x1f50e; CSDN主页&#xff1a; 奈斯DB    &#x1f50e; IF Club社区主页&#xff1a; 奈斯、    &#x1f50e; 微信公众号&#xff1a; 奈斯DB &#x1f525;《擅长领域》&#xff1a;    &#x1f5c3;️ 数据库…...

鸿蒙与Android双端蓝牙开发避坑指南:定位权限、虚拟地址与厂商SDK那些事

鸿蒙与Android双端蓝牙开发实战&#xff1a;权限策略与真实地址获取全解析 当你的应用需要同时在鸿蒙和Android设备上稳定运行蓝牙功能时&#xff0c;系统差异就像一片雷区——Android 12的权限拆分、鸿蒙4.0的虚拟地址返回、不同版本间的API兼容性&#xff0c;每个环节都可能让…...

用战神引擎开服后,别忘了这几步:服务器安全、日志监控与性能调优指南

战神引擎开服后的高阶运维指南&#xff1a;安全加固、日志监控与性能调优实战 当你成功用战神引擎架设传奇手游服务器后&#xff0c;真正的挑战才刚刚开始。服务器能跑起来只是第一步&#xff0c;如何让它跑得稳、跑得安全、跑得高效&#xff0c;才是区分普通服主和专业运维的关…...