首先我们要了解什么是身份认证(Authentication)?

身份认证也叫身份验证或者鉴权,指通过一定的手段来完成对用户身份的验证

我们会使用session和JWT认证机制进行开发,那么我们在什么情况下使用这俩个认证机制呢?

推荐在服务端渲染开发情况下使用session认证机制

在前后端分离的Web开发环境下使用JWT认证机制

目录

一.session认证机制

1.HTTP协议的无状态性

2.Cookie突破HTTP无状态的限制

3.Cookie的缺点

4.提高身份认证的安全性

5.使用session

6.向session中存储数据

7.向session中获取数据

8.清空session

二.JWT认证机制

1.定义secret密钥

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

3.捕获解析JWT字符串失败-怎么解决项目崩溃问题


一.session认证机制

我们学习session认证机制需要从HTTP协议这里开始出发:

1.HTTP协议的无状态性

HTTP协议无状态性指的是客户端的每一次HTTP请求都是独立的,连续多次的请求之间没有直接的关系,服务器也不会主动的保留每一次HTTP请求的状态

什么意思呢?

比如现在我们在上大学,出入校园是需要门卡的,一个学校几万人甚至更多,那么一个保安叔叔可以记住我们这么多人吗?当然是记不住的,我们出入校园需要使用门卡这个认证方式或者认证工具来证明我们就是这个学校的学生,我们可以进去

而HTTP协议的无状态性,就是相当于你每次出入校园都没有门卡,并且保安叔叔还记不住你,如果想出入,那么需要找学校认证一下,每一次出入都认证,那真的很麻烦

2.Cookie突破HTTP无状态的限制

所以我们现在需要使用"门卡"来突破HTTP无状态的限制

Cookie就是我们的门卡,就是证明我们是学生的认证方式

我们回到我们的编程世界中---------Cookie是什么?

Cookie是存储在用户浏览器中的一段不超过4kb的字符串,它由一个名称、一个值以及其他控制Cookie有效期、安全性、使用范围的可选属性组成

不同域名下的Cookie是各自独立的:比如我们在百度注册了一个会员,我们可以在淘宝里面使用百度的VIP吗?是不能的;再者我们拿着清华的校园卡,可以进北大的校园吗?我不在清华我没试过,哈哈

每当客户端发起请求的时候,会自动的把当前域名下的所有的没有过期的Cookie一同发送到服务器进行身份的验证

总结Cookie:自动发送-->域名独立-->过期时限(过期不能使用)-->4kb存储空间

3.Cookie的缺点

Cookie是不具有安全性的,为什么说Cookie不具有安全性呢?

因为Cookie是存储在浏览器中的,而且浏览器也提供了读写Cookie的API,因此Cookie是很容易被伪造的,不具有安全性

所以用户的隐私数据(身份信息以及密码)不要使用Cookie来存储

4.提高身份认证的安全性

Cookie虽然不具安全性,但是我们使用一些手段对Cookie进行认证的话,就会大大提高用户信息的安全性

使用什么手段?

没错,就是我们之前所提到的session认证机制

我们稍后来谈session的使用方法,我们先来了解一下session的工作原理:

用户的信息不再存在于浏览器中,而是存储在服务器中,发送给浏览器的只是一个简单的Cookie,客户端下次请求的时候,会将Cookie再次发送到服务器,服务器会根据发送来的Cookie查找对应的用户信息

5.使用session

首先我们先配置一个express-session中间件,当用户请求时,必须先经过这个session中间件的处理,才能由路由执行这次请求,返回给客户端相对于信息的内容

下载express-session中间件

npm i express-session

导入express-session中间件

const session = require('express-session')

配置session中间件(需配置对象)

服务器实例.use(session({secret:'keyboard test',resave:false,saveUninitialized:true
}))//resave与saveUninitialized为固定写法
//secret我们可以填写任意字符串

6.向session中存储数据

当express-session中间件配置成功后,我们就可以通过req.session来访问和使用这个session对象了,从而存储用户的关键信息

//用户登录
服务器实例.post('api/login',(req,res)=> {if(req.body.username !== 'admin123' || req.body.password !== '000000'){return res.send({status:1,msg:"登陆失败-因为用户名或者密码输入错误"})}else{//如果成功,将用户的信息存储在session中//自定义一个user与login登录状态属性req.session.user = req.bodyreq.session.islogin = truereq.send({status:0,msg:"登陆成功"})}
})

7.向session中获取数据

我们可以直接的从req.session对象上获取到之前所存储的数据

//获取用户姓名的接口
服务器实例.get('api/username',(req,res)=> {//首先判断用户是否登录if(!req.session.islogin){return res.send({status:1,msg:'fail'})}else{res.send({status:0,msg:'success',username:req.session.user.username})}
})

8.清空session

调用req.session.destroy()函数清空session服务器所保存的当前用户的session信息

//退出登录的接口
服务器实例.post('api/logout',(req,res)=> {//清空当前客户端对应session信息req.session.destory()res.send({status:0,msg:"退出登录成功"})
})

二.JWT认证机制

我们使用JWT,那么就一定由JWT强于session的地方,那么session哪里不足呢?

session认证机制需要配合Cookie才能实现,但是我们知道因为同源策略,Cookie是不支持跨域访问的,所以涉及到前端跨域请求后端接口的时候,需要做很多很多额外的配置才可以实现跨域session认证,这样是很麻烦的

所以当前端请求后端接口不存在跨域问题的时候,我们session认证机制是比较好的(也就是当我们选择服务端渲染的Web开发模式时,使用session认证方式)

但是当前后端分离开发Web时,也就是前端需要跨域请求后端接口的时候,使用JWT认证机制

JWT全称JSON Web Token,他把用户信息通过Token加密字符串的形式保存到客户端浏览器中,而session是保存在服务器端的

那么等等...........

我们不是说存储在浏览器中的数据不安全吗?为什么JWT保存到了客户端浏览器中?

其实保存到客户端浏览器的是一长串的加密字符(也叫密钥),浏览器是无法解析的,并且有效的防止了JWT字符串在网络传输过程中被别人破解,需要返回给服务器端解析,所以它是安全的,我们之前说的是单单使用Cookie是不安全的

JWT是由Header头部、Payload有效荷载、Signature签名三部分组成的(三者之间使用.来分隔)

ZUdTY3hic3pMRGxlOHNXcnZSM08zS21DQmJXbUtmWUtjaHhpN3lYZ3RZWnNsU0.pFNCtINnlmU1BZZVdXUUxnZy0tUnVBV2NHdnNoVGZyMVdMRTFzTXJhZz09.9f871e86b9bf50b484e614b2c7342afb86cab3c4

像这样,Payload存储的是用户的信息,它是一个用户信息经过加密之后生成的字符串

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

当客户端收到了服务器返回的JWT之后,通常会将它存储在localStorage或者sessionStrage中(我们并不陌生,之前提到过的本地存储,是一个浏览器给我们提供的一个5M或者20M左右的空间)

在以后客户端每次与服务器通信的时候,都会带上这个JWT的加密字符串来进行身份的验证

我们最好可以把JWT放在HTTP请求头的Authorization字段中

Authorization: Bearer <token>

1.定义secret密钥

首先我们先安装配置好JWT

npm i jsonwebtoken express-jwt

这里我们为什么要下载俩个包呢?因为是需要加密解密的,加密是一种功能,解密又是一种功能

jsonwentoken用于生成加密字符串;express-jwt用来将JWT加密字符串解析还原为JSON对象

然后我们导入这俩个模块

const token = require('jsonwebtoken')
const jwt = require('express-jwt')

接下来我们就可以进行定义secret密钥了:

token:jwt.sign({username:req.body.username},secretkey,{expiresIn:'30s'}
)//30s代表这个token有效期为30s,过了30s就失效了,更加的安全

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

当客户端每次去访问那些有权限的接口时,都需要主动通过请求头中的Authorization字段将Token字符串发送到服务器进行身份验证

首先我们需要使用服务器实例的use()来注册一个中间件:

服务器实例.use()

然后使用expressJWT({secret:secretKey})来解析Token中间件,使用unless({path:[/^\/api\//]})来指定哪些接口时不需要访问权限的(注意正则的转义)

服务器实例.use(expressJWT({secret:secretKey}).unless({path:[/^\/api\//]}))

配置成功express-jwt中间件之后,我们就可以把解析出来的用户信息挂载到req.user属性上,然后通过req.user对象访问从JWT加密字符串中解析出来的用户信息了

tips:不要把密码加密到Token字符串上

3.捕获解析JWT字符串失败-怎么解决项目崩溃问题

当我们使用express-jwt解析Token字符串时,如果客户端发送过来的Token字符串过期或者不合法,那么会产生一个解析失败的错误,影响项目的正常运行或使项目崩溃

这个问题很简单就可以解决了,我们可以通过Express的一个错误中间件来捕获到这个错误并处理

//注册错误中间件
服务器实例.use((err,req,res,next)=> {if(err.name === 'UnauthorizedError'){return res.send({ststus:401,message:'无效的Token'})}else{//如果是其他的错误res.send({status:500,message:'未知错误'})}
})

身份认证——session认证机制与JWT认证机制(入门到使用)相关推荐

  1. Node.js数据库与身份验证(MySQL,前后端身份认证:Session 认证机制,JWT认证机制)

    目录 MySQL SQL 语句语法 where 条件.and 和 or 运算符.order by 排序.count(*) 函数 在express项目中操作 MySQL 安装与配置 mysql 模块 1 ...

  2. node.js学习总结:node.js的内置模块,模块化,npm与包 express,前后端身份认证 JWT认证机制

    node.js学习总结 什么是node.js node.js的内置模块 fs系统模块 path路径模块 http模块 模块化 npm与包 express express路由 express+mysql ...

  3. 前后端身份认证:session身份认证,JWT认证

    文章目录 前后端身份认证 1.概述 2.不同开发模式下的身份认证 3.关于HTTP协议的无状态性 4.Cookie 4.1 介绍 4.2 cookie特点 4.3 cookie分类 4.4 Cooki ...

  4. jwt 私钥_三分钟带你了解JWT认证

    目录 一.JWT简介 二.JWT认证和session认证的区别 三.JWT认证流程 四.JWT组成 五.JWT使用场景 一.JWT简介 JSON Web Token(JWT)是一个开放的标准(RFC ...

  5. 身份认证 Session认证机制 Cookie原理

    身份认证 什么是身份认证 身份认证又称"身份验证"."鉴权",是指通过一定的手段,完成对用户身份的确认. 日常生活中的身份认证随处可见,例如:高铁的验票乘车,手 ...

  6. jwt认证机制优势和原理_最详细的Spring Boot 使用JWT实现单点登录

    Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(S ...

  7. django值jwt认证提示身份认证信息未提供

    django值jwt认证提示身份认证信息未提供 具体提示如下: drf {"detail":"身份认证信息未提供."} 原因(一般第二种的可能性较大) 第一种: ...

  8. Web API与JWT认证

    2019独角兽企业重金招聘Python工程师标准>>> ​JWT(Json Web Token)定义了一种使用Json形式在网络间安全地传递信息的简洁开放的标准(RFC 7519). ...

  9. GoWeb 项目实战:使用 Iris 框架构建一个安全可靠的 API 服务(附 JWT 认证实现)

    1.前言 我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并 ...

最新文章

  1. 安装debian第一天遇到的几个问题及解决方案
  2. 线下沙龙 | 小身材大能量!用英伟达智能小车Jetbot玩转深度学习
  3. 【NBIoT无线模块DTU数传电台】串口服务器RS232/RS485端口工业路由信号传输
  4. 【HDU - 5977】Garden of Eden(树分治)
  5. 一篇英文文档中找出频数最多的10个单词
  6. php 判断是否文件,php 判断是否一个文件的函数is_file()应用举例
  7. 微信知识付费小程序博客源码(带299条数据)
  8. phpMyAdmin批量修改Mysql数据表前缀的方法
  9. 20201016:力扣第210周周赛题解(下)
  10. 简述 JPA 与 Spring Data JPA 与 Hibernate
  11. 自动驾驶数据集_奥迪推出大型自动驾驶数据集A2D2
  12. 物联卡买回来怎么设置网速快_请自查!物联卡网速快慢,看看你的物联卡显示的是LTE还是4G...
  13. 给定一个数组,求数组的最大连续子数组,使得该子数组的和最大
  14. 计算机找不到ie浏览器,ie浏览器不见了,教您ie浏览器不见了怎么办
  15. RecyclerView通用适配器
  16. js+css制作导航栏下划线跟随动画,App+H5点击效果
  17. Verilog 实现斐波那契数列
  18. Golang 基础二
  19. gog无效的验证码_GOG提供了Linux游戏,Steam Controller推测等等
  20. 计算机网络综合组网实验、综合组网实验

热门文章

  1. 阳振坤:OceanBase如何跨越关系数据库的“死亡之谷”
  2. 国外健身跑步时最爱听的100首歌
  3. 【SEO新手教程】学会这8点,网站被搜索引擎(百度)降权再也不怕了
  4. 华尔街日报图表_阅读《华尔街日报》文章而无需花一分钱(合法)
  5. 使用Openlayers绘制Geoserver离线瓦片
  6. MQ(MessageQueue)消息队列
  7. 双赢16帮源码程序淘宝商家平台源码程序仿大麦户谷得源码程序完整版源码
  8. JavaScript(js)实现继承的几种方式
  9. Minio设置永久下载链接
  10. rsync远程同步和inotify实时同步