❤Node08-Express-jwt身份认证

❤Node08-Express-jwt身份认证

1、token基本概念​

Session认证的局限性​

Session 认证机制需要配合Cookie才能实现。由于 Cookie 默认不支持跨域访问,所以,当涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实现跨域 Session 认证。

注意:

  • 当前端请求后端接口不存在跨域问题的时候,推荐使用 Session 身份认证机制。
  • 当前端需要跨域请求后端接口的时候,不推荐使用 Session 身份认证机制,推荐使用 JWT 认证机制。

什么是token​

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

jwt的原理

总结

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

jwt的组成​

JWT 通常由三部分组成,分别是 Header(头部)、Payload(有效荷载)、Signature(签名) 。

三者之间使用英文的“.”分隔,格式如下:

plain

js
复制代码
Header.Payload.Signature// 列如
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7Im5hbWUiOiJ6cyIsInBhc3N3b3JkIjoxMjN9LCJpYXQiOjE2Mzc1MDcyNzksImV4cCI6MTYzNzUxODA3OX0.0o9PCv-11SxM8TgMns--S0D-ZnidYZdXLk13V_B35B0

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

JWT 的三个组成部分,从前到后分别是 Header、Payload、Signature。

其中:

  • payload 部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串。
  • Header 和 Signature 是安全性相关的部分,只是为了保证 Token 的安全性。

jwt的使用方式​

前端

  1. 客户端收到服务器返回的 JWT 之后,通常会将它储存在localStorage 或sessionStorage 中。
  2. 此后,客户端每次与服务器通信,都要带上这个 JWT 的字符串,从而进行身份认证。推荐的做法是把 JWT 放在 HTTP 请求头的 Authorization 字段中,格式如下:

js

Authorization: Bearer [token]

后端

  1. 登录成功, 生成token, 返回给浏览器
  2. 所有的接口中. 判断请求头是否携带了token(登录页面除外)

2、使用jwt​

express-jwt 介绍和认识 (后面抽离为单个模块)​

express-jwt的官网

https://www.tabnine.com/code/javascript/functions/express-jwt/expressJwt

1、简述​

JWT ,全称JSON Web Token,本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。

个人理解:其实本质上就是添加了一个安全性的签名然后用这个签名来校验是不是安全的。

express-jwt是express的中间件,用来解析请求对象的JWT负载。

2、简单用法​

使用HS256加密的JWT:

javascript

var { expressjwt: jwt } = require("express-jwt");app.get("/protected",jwt({ secret: "helloworld", algorithms: ["HS256"] }),function (req, res) {if (!req.auth.admin) return res.sendStatus(401);res.sendStatus(200);}
);

3、express-jwt参数详解​

expressjwt的参数列表如下:

secret:必须的参数,为字符串string类型 或者 GetVerificationKey函数接口

GetVerificationKey = (req: express.Request, token: jwt.Jwt | undefined) => Promise<jwt.Secret>;

getToken?:可选的参数,TokenGetter接收快速请求并返回令牌的函数,默认情况下它在Authorization头中查找。

isRevoked?:可选的参数,一个验证令牌是否被撤销的函数,函数接口如下:

IsRevoked = (req: express.Request, token: jwt.Jwt | undefined) => Promise; credentialsRequired?:可选的参数,类型为bool,当为false时,如果请求不包含令牌,则继续到下一个中间件,而不是失败,默认为true。 requestProperty?:可选的参数,类型为string,请求对象中设置有效负载的属性的名称。

4、安全漏洞​

当提供第三方库作为机密时,需要使用算法参数来防止潜在的降级攻击。
不要混合使用对称算法和非对称算法(如HS256/RS256):在没有进一步验证的情况下混合使用算法可能会潜在地导致降级漏洞。

javascript

jwt({secret: "shhhhhhared-secret",algorithms: ["HS256"],//algorithms: ['RS256']
});

Pager

Previous page

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

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

相关文章

【JVM】JVM栈帧中的动态链接 与 Java的面向对象特性--多态

栈帧 每一次方法调用都会有一个对应的栈帧被压入栈&#xff08;虚拟机栈&#xff09;中&#xff0c;每一个方法调用结束后&#xff0c;都会有一个栈帧被弹出。 每个栈帧中包括&#xff1a;局部变量表、操作数栈、动态链接、方法返回地址。 JavaGuide&#xff1a;Java内存区域…

PostgreSQL的操作系统兼容性

PostgreSQL的操作系统兼容性 PostgreSQL 能运行在多种操作系统上&#xff0c;以下是一些主要支持的操作系统&#xff1a; Unix/Linux 系统 Linux&#xff1a;几乎所有的主流 Linux 发行版&#xff08;如 Debian、Ubuntu、Red Hat、CentOS、SuSE 等&#xff09;都支持 Postgr…

Debian项目实战——环境搭建篇

Debian系统安装 准备工作 1、系统镜像&#xff1a;根据自己的需要选择合适的版本格式&#xff1a;x86 / arm 架构 | 最好下载离线安装版本 | 清华镜像源 2、制作工具&#xff1a;balenaEtcher 3、系统媒介&#xff1a;16G以上U盘最佳 烧录镜像 打开balenaEtcher进行烧录&am…

11. 建立你的第一个Web3项目

11. 建立你的第一个Web3项目 在这一部分&#xff0c;我们将带你一步步地建立一个简单的Web3项目&#xff0c;从环境搭建到智能合约的创建与部署&#xff0c;再到开发一个去中心化应用&#xff08;dApp&#xff09;并与智能合约交互。这是你迈向Web3开发的第一步。 1. 环境搭建…

1.简述语言建模LM、统计语言建模SLM、神经语言模型NLM、预训练语言模型PLM、大语言模型LLM

语言是人类表达和交流的突出能力&#xff0c;它在儿童早期发展并在一生中不断演变。然而&#xff0c;机器除非配备了强大的人工智能算法&#xff0c;否则不能自然地掌握以人类语言形式理解和交流的能力。实现让机器像人类一样阅读、写作和交流的目标&#xff0c;一直是一个长期…

改变事件

窗口的某些属性的状态发生改变时就会触发该事件 对应的事件类型包括 QEvent::ToolBarChange, QEvent::ActivationChange, QEvent::EnabledChange, QEvent::FontChange,QEvent::StyleChange, QEvent::PaletteChange, QEvent::WindowTitleChange, QEvent::IconTextChange, QEve…

GO Govaluate

govaluate 是一个用于在 Go 语言中动态求值表达式的库。它允许你解析和评估字符串形式的表达式&#xff0c;这些表达式可以包含变量、函数以及逻辑、算术和比较操作。它非常适合在运行时处理复杂的逻辑规则和条件表达式&#xff0c;而不需要重新编译代码。 安装 govaluate go…

SpringMVC中使用REST风格

了解REST REST&#xff1a;即 Representational State Transfer。&#xff08;资源&#xff09;表现层状态转化。是目前最流行的一种互联网软件架构。使用这种架构的应用即为RESTFUL。它结构清晰、符合标准、易于理解、扩展方便&#xff0c; 所以正得到越来越多网站的采用。 …

【练习9】大数加法

链接&#xff1a;大数加法__牛客网 (nowcoder.com) 分析&#xff1a; 当作竖式计算 import java.util.*;public class Solution {public String solve (String s, String t) {StringBuffer ret new StringBuffer();//i是字符串s的最后一个字符的索引int i s.length() - 1;//j…

新能源汽车安全问题如何解决?细看“保护罩”连接器的守护使命

「当前市场上绝大部分电池的安全系数远远不够」。 在一场世界动力电池大会上&#xff0c;宁德时代的董事长曾毓群这样犀利直言。 从汽车开始向电动化转型升级那天起&#xff0c;动力电池的安全隐患就一直是个老生常谈的话题了。曾毓群的这句话&#xff0c;直接点明了行业的发展…

参数传了报错没传参数识别不到参数传丢

【记一次参数传值了但报错未传值的问题解决历程】 问题描述&#xff1a;同一个接口&#xff0c;用测试类调可以成功&#xff0c;用postman调用一直报错少参数&#xff0c;后又尝试了用idea自带的http调用&#xff0c;同样报错参数未传值。 如图&#xff0c;传值了报错未传值。…

Java并发:互斥锁,读写锁,Condition,StampedLock

3&#xff0c;Lock与Condition 3.1&#xff0c;互斥锁 3.1.1&#xff0c;可重入锁 锁的可重入性&#xff08;Reentrant Locking&#xff09;是指在同一个线程中&#xff0c;已经获取锁的线程可以再次获取该锁而不会导致死锁。这种特性允许线程在持有锁的情况下&#xff0c;可…

AI网盘搜索 1.2.6 智能文件搜索助手,一键搜索所有资源

对于经常需要处理大量文件的人来说&#xff0c;AI网盘检索简直是救星。它提供了智能对话式搜索功能&#xff0c;只需用自然语言描述就能找到需要的文件。此外&#xff0c;它还广泛支持各种文件类型&#xff0c;从文档到图片&#xff0c;全面覆盖。精准定位功能让您能够快速找到…

DSC+主备+异步备库搭建

DSC主备异步备库搭建 本次在DSC的基础上进行主备集群异步备库的搭建&#xff0c;实现DSC主备异步备库的集合。 这里DMDSC集群是看做一个数据库服务&#xff08;即DSC集群内的都叫主库&#xff09;&#xff0c;备库是一个单机实例 环境配置 服务器配置 端口配置 实例名PORT…

C#获取计算机信息

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Management; n…

Vulnhub:bassamCTF

靶机下载地址 信息收集 主机发现 扫描攻击机同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 靶机ip&#xff1a;192.168.31.165 端口扫描 nmap 192.168.31.165 -A -p- -T4 开放端口22&#xff0c;80。 网站信息收集 访问80端口的http服务。首页是空白页面&#xff0c;…

关于打不开SOAMANAGER如何解决

参考文章&#xff1a;https://blog.csdn.net/yannickdann/article/details/115396035 打开SE93

15_分布式数据结构

菜鸟&#xff1a; 老鸟&#xff0c;我最近在处理大量数据的时候遇到了瓶颈&#xff0c;单台服务器的内存和计算能力都不够用了。你知道有什么方法可以解决这个问题吗&#xff1f; 老鸟&#xff1a; 嗯&#xff0c;这种情况很常见。你可以考虑使用分布式数据结构。听说过吗&a…

ARM base instruction -- blr

BLR Branch with Link to Register calls a subroutine at an address in a register, setting register X30 to PC4. 带寄存器链接的分支在寄存器中的某个地址调用一个子程序&#xff0c;将寄存器 X30 (lr) 设置为 PC4。 BLR <Xn> BLR 跳转到reg内容地址&#xff0c;…

Django创建模型

1、根据创建好应用模块 python manage.py startapp tests 2、在models文件里创建模型 from django.db import modelsfrom book.models import User# Create your models here. class Tests(models.Model):STATUS_CHOICES ((0, 启用),(1, 停用),# 更多状态...)add_time mode…