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令牌" });}});

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

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

相关文章

软件测试/测试开发丨Selenium 高级定位 Xpath

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27036 一、xpath 基本概念 XPATH是一门在XML文档中查找信息的语言 XPATH使用路径表达式在XML文档中进行导航 XPATH的应用非常广泛,可以用于UI自…

【哈士奇赠书活动 - 37期】- 〖深入浅出SSD:固态存储核心技术、原理与实战 第2版〗

文章目录 ⭐️ 赠书 - 《深入浅出SSD:固态存储核心技术、原理与实战 第2版》⭐️ 内容简介⭐️ 作者简介⭐️ 编辑推荐⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《深入浅出SSD:固态存储核心技术、原理与实战 第2版》 ⭐️ 内容简介 本书从基础认知、核心技…

RabbitMQ+springboot用延迟插件实现延迟消息的发送

延迟队列:其实就是死信队列中消息过期的特殊情况 延迟队列应用场景: 可以用死信队列来实现,不过死信队列要等上一个消息消费成功,才会进行下一个消息的消费,这时候就需要用到延迟插件了,不过要线在docker上…

基于Java的代驾管理系统 springboot+vue,mysql数据库,前台用户、商户+后台管理员,有一万五千字报告,完美运行

基于Java的代驾管理系统 springbootvue,mysql数据库,前台用户、商户后台管理员,有一万五千字报告,完美运行。 系统完美实现用户下单叫车、商户接单、管理员管理系统,页面良好,系统流畅。 各角色功能&#x…

【探索C++】输入输出

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮&#xff0…

nuxt3+ts+vue3的ssr项目总结

目录 一、什么是SSR、SEO、SPA,它们之间的关系又是怎样的。 二、VUE做SSR的几种方法 1、插件prerender-spa-plugin 2、VUE开启SSR渲染模式 3、使用NUXT框架 三、NUXT3VUE3TS (一)基本配置 1、文件夹介绍 assets components pages…

2023年数字孪生行业研究报告

第一章 行业概况 1.1 定义 数字孪生(Digital Twin)是一种先进的建模技术,它通过创建一个物理实体的虚拟复制品,以实时模拟、预测和优化实体的行为和性能。这个虚拟模型会同步收集和分析来自其物理对应物的数据,从而提…

Matlab图像处理-图像缩放

基本概念 图像缩放是指将给定的图像在x轴方向按比例缩放a倍,在y轴方向按比例缩放b倍,从而获得一幅新的图像。 如果ab,即在x轴方向和y轴方向缩放的比率相同,则称这样的比例缩放为图像的全比例缩放。 如果a≠b,图像比…

全画面塑料激光透光率测试仪

随着光学塑料成型技术的不断发展,光学塑料透镜在各类光学系统中得到了广泛的应用。光学塑料具有便于大批量生产,设计灵活性高,重量轻和耐冲击等特点。最近几年来,国内外有许多专家学者对热塑性半结晶塑料激光焊接工艺上的应用进行…

【微服务部署】02-配置管理

文章目录 1.ConfigMap1.1 创建ConfigMap方式1.2 使用ConfigMap的方式1.3 ConfigMap使用要点建议 2 分布式配置中心解决方案2.1 什么时候选择配置中心2.2 Apollo配置中心系统的能力2.2.1 Apollo创建配置项目2.2.2 项目使用2.2.3 K8s中使用Apollo 1.ConfigMap ConfigMap是K8s提供…

零撸大肉,赛博尔Seppol游戏,无限制闯关打碎片,装备,直接变现项目。

2023年7月10日,在上海外滩酒店—— 由来自硅谷、华尔街的技术先锋,与中国科技翘楚阿里、腾讯的骨干团队联手呈现,区块链元宇宙游戏塞波尔 Seppol于上海精彩亮相路演。 1,栖息之地,宠物可放入栖息之地进行挖矿&#xf…

自动驾驶和辅助驾驶系统的概念性架构(二)

摘要: 本篇为第二部分主要介绍底层计算单元、示例工作负载 前言 本文档参考自动驾驶计算联盟(Autonomous Vehicle Computing Consortium)关于自动驾驶和辅助驾驶计算系统的概念系统架构。该架构旨在与SAE L1-L5级别的自动驾驶保持一致。本文主要介绍包括功能模块图…