Node.js —— 前后端的身份认证 之用 express 实现 JWT 身份认证

JWT的认识

什么是 JWT

        JWT(英文全称:JSON Web Token)是目前最流行的跨域认证解决方案。

JWT 的工作原理

        总结:用户的信息通过 Token 字符串的形式,保存在客户端浏览器中。服务器通过还原 Token 字符串的形式来认证用户的身份。 

 JWT 的组成部分

        JWT 通常由三部分组成,分别是 Header(头部)、Payload(有效荷载)、Signature(签名)。 三者之间使用英文的“.”分隔,格式如下:

下面是 JWT 字符串的示例:

 JWT 的三个部分各自代表的含义

        JWT 的三个组成部分,从前到后分别是

  • Header
  • Payload
  • Signature

        其中:  Payload 部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串。

         Header 和 Signature 是安全性相关的部分,只是为了保证 Token 的安全性。

JWT 的使用方式

        客户端收到服务器返回的 JWT 之后,通常会将它储存在 localStorage 或 sessionStorage 中。

         此后,客户端每次与服务器通信,都要带上这个 JWT 的字符串,从而进行身份认证。推荐的做法是把 JWT 放在 HTTP 请求头的 Authorization 字段中,格式如下: 

在 Express 中使用 JWT

1.安装 JWT 相关的包

        运行如下命令,安装如下两个 JWT 相关的包:

 其中:

  • jsonwebtoken 用于生成 JWT 字符串
  • express-jwt 用于将 JWT 字符串解析还原成 JSON 对象

2. 导入 JWT 相关的包

使用 require() 函数,分别导入 JWT 相关的两个包:

3. 定义 secret 密钥

        为了保证 JWT 字符串的安全性,防止 JWT 字符串在网络传输过程中被别人破解,我们需要专门定义一个用于加密和解密的 secret 密钥:

  • 当生成 JWT 字符串的时候,需要使用 secret 密钥对用户的信息进行加密,最终得到加密好的 JWT 字符串
  • 当把 JWT 字符串解析还原成 JSON 对象的时候,需要使用 secret 密钥进行解密 

4. 在登录成功后生成 JWT 字符串

调用 jsonwebtoken 包提供的 sign() 方法,将用户的信息加密成 JWT 字符串,响应给客户端:

 5. 将 JWT 字符串还原为 JSON 对象

        客户端每次在访问那些有权限接口的时候,都需要主动通过请求头中的 Authorization 字段,将 Token 字符串发送到服务器进行身份认证。 此时,服务器可以通过 express-jwt 这个中间件,自动将客户端发送过来的 Token 解析还原成 JSON 对象:

6. 使用 req.user 获取用户信息

        当 express-jwt 这个中间件配置成功之后,即可在那些有权限的接口中,使用 req.user 对象,来访问从 JWT 字符串中解析出来的用户信息了,示例代码如下:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea2024 nacos中文报错

idea2024 nacos中文报错 报错提示为:Input length 1 报错原因:项目启动编码与nacos编码不一致。 处理方式 添加启动参数utf8修改项目编码格式为utf8 修改idea.vmoptions Help -> Edit Custom 添加一行:-Dfile.encodingUTF-8

解决LabVIEW通过OPC Server读取PLC地址时的错误180121602

在使用LabVIEW通过OPC Server读取PLC地址时,若遇到错误代码180121602,建议检查网络连接、OPC Server和PLC配置、用户权限及LabVIEW设置。确保网络畅通,正确配置OPC变量,取消缓冲设置以实时读取数据,并使用诊断工具验证…

项目9-网页聊天室2(登录)

0.前端知识储备 Ajax请求中的async:false/true的作用 - front-gl - 博客园 (cnblogs.com) 01.前端页面展示 02.后端代码 2.1 CONTROLLER RequestMapping("/login")public Result login(String username, String password, HttpSession httpSession){User user …

macOS Monterey 12.7.5 (21H1222) Boot ISO 原版可引导镜像下载

macOS Monterey 12.7.5 (21H1222) Boot ISO 原版可引导镜像下载 5 月 13 日凌晨,macOS Sonoma 14.5 发布,同时带来了 macOS Ventru 13.6.7 和 macOS Monterey 12.7.5 安全更新。 本站下载的 macOS 软件包,既可以拖拽到 Applications&#x…

windows上pycharm调试streamlit应用

windows上pycharm调试streamlit应用 开发环境: PyCharm 2023.3.5 (Professional Edition) windows10 conda(python3.11.7) streamlit1.33.0 创建应用 app.py import streamlit as stst.header("hello") st.write("this is a streamlit demo")启动应…

使用Python探究OpenAI API

谁没听说过OpenAI?这家人工智能研究实验室因其著名的产品ChatGPT而改变了世界。它改变了AI实施领域,许多公司现在急于成为下一大热点。 尽管竞争激烈,OpenAI仍然是任何生成式AI业务需求的首选公司,因为它拥有最好的模型和持续的支持。该公司…

【Jmeter】使用Jmeter进行接口测试、跨线程组获取参数

Jmeter接口测试 Jmeter设置成中文实操练习-跨线程组提取参数,使用值HTTP请求默认值&HTTP信息头管理器 相信打算从事测试工程师的同学们,肯定对Jmeter是耳熟能详的。使用Jmeter可以进行接口测试、性能测试、压力测试等等;这个章节介绍如何…

【机器学习论文阅读笔记】Robust Recovery of Subspace Structures by Low-Rank Representation

前言 终于要轮到自己汇报了好崩溃。。盯着论文准备开始做汇报ppt感觉一头乱麻,决定还是写博客理清思路再说吧 参考资料: 论文原文:arxiv.org/pdf/1010.2955 RPCA参考文章:RPCA - 知乎 (zhihu.com) 谱聚类参考文章&#xff1a…

Ubuntu 安装 LibreOffice

1. 删除预安装的LibreOffice Ubuntu 和其他的 Linux 发行版带有预安装的 LibreOffice。这可能不是最新的,这是因为发行版有特定的发行周期。在进行新安装之前,你可以通过以下命令删除 Ubuntu 及其衍生发行版中的的旧版本。 sudo apt remove –purge li…

Java进阶学习笔记2——static修饰成员变量

static: 叫静态,可以修饰成员变量、成员方法。 成员变量按照有无static修饰,分为两种: 类变量:有static修饰,属于类,在计算机中只有一份,会被类的全部对象共享。静态成员变量。 实…

FL Studio2025新功能大揭秘,你准备好了吗?

FL Studio,常被音乐制作者亲切地称为“水果”编曲软件,是比利时的Image-Line公司研发的一款完整的软件音乐生产环境或数字音频工作站(DAW)。自从1997年推出以来,它已经成为全世界众多电子音乐制作者和DJ的首选工具&…

信息学奥赛初赛天天练-10-组合数学-排列组合-一次彻底搞懂分组分配问题

更多资源请关注纽扣编程微信公众号 平均分组 是指将所有的元素分成所有组元素个数相等或部分组元素个数相等,即m个不同的元素平均分成n个组,有多少种分组方法 由于是平均分组,分组选择元素时会出现重复,因此结果需要除以A(n,n…

C++的数据结构(十八):并查集

并查集(Union-Find)是一种用于处理一些不交集(Disjoint Sets)问题的数据结构。它主要支持两种操作:合并集合(Union)和查找元素所属集合(Find)。在解决诸如连通性问题、网…

【Linux】POSIX线程库——线程控制

目录 1.线程创建方法 例:多线程创建 2.线程终止 2.1 return nulptr; 2.2 pthread_exit(nullptr); 3. 线程等待 3.1 等待原因 3.2 等待方法 线程终止的返回值问题 4.线程取消 5. 线程分离 5.1 分离原因 5.2 分离方法 6.封装线程 用的接口是POSIX线程库…

读人工智能时代与人类未来笔记13_网络57

1. jun背控制 1.1. 威慑的目的是通过威胁发动盒站来防止盒站 1.2. jun背控制的目的是通过限制甚至废除57(或57类别)本身来防止盒站真 1.2.1. 与盒不扩散相配合,以一整套详尽的条约、技术保障措施、监管和其他控制机制为支撑,所…

如何生成Github Badge徽章图标

如何生成徽章Badge 什么是徽章(Badge)生成小徽章shields网站开源项目的徽章lib版本徽章代码测试覆盖度开源协议Github workflow的徽章 开源代码实践效果py-enumjs-enumerate 什么是徽章(Badge) 在开源项目的README中,经常会见到一些徽章(Badge)小图标,如…

ViLT学习

多模态里程碑式的文章,总结了四种多模态方法,根据文字和图像特征特征抽取方式不通。 文章的贡献主要是速度提高了,使用了数据增强,文本的mask 学习自b站朱老师的论文讲解

无线领夹麦克风哪个品牌好?无线麦克风品牌排行榜前十名推荐

​在当今的数字化浪潮中,个人声音的传播和记录变得尤为重要。无论是会议中心、教室讲台还是户外探险,无线领夹麦克风以其卓越的便携性和连接稳定性,成为了人们沟通和表达的首选工具。面对市场上琳琅满目的无线麦克风选择,为了帮助…

小程序多端框架目前所遇问题记录

一、wx.openLocation兼容 1、申请腾讯地图key 2、配置LBS SDK,选择SDK最新版本 3、调用接口,name和address必须输入,不然要报错 uni.openLocation({latitude: Number(this.info.latitude),longitude: Number(this.info.longitude),name:this…

全域外卖是谁创办的公司?

全域外卖是谁创办的公司?这个问题是抽象的。正确的问法应该是全域外卖是谁研发的系统。 在了解全域外卖系统前,我们首先要了解什么是全域外卖,什么是全域团购。全域指的是多平台。当然这个平台是越多越好。实际上也可以理解为聚合外卖、聚合…