热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Node.js入门详解(四)

数据库与身份认证1.数据库的基本概念1.1什么是数据库1.2常见的数据库及分类1.3传统型数据库的数据组织结构1.3.1Excel的数据组织结构1.3.2传统型数据库的数据组织结构


数据库与身份认证

  • 1. 数据库的基本概念
    • 1.1 什么是数据库
    • 1.2 常见的数据库及分类
    • 1.3 传统型数据库的数据组织结构
      • 1.3.1 Excel的数据组织结构
      • 1.3.2 传统型数据库的数据组织结构
      • 1.3.3 实际开发中库、表、行、字段的关系
  • 2. 安装并配置MySQL
    • 2.1 了解需要安装哪些 MySQL 相关的软件
    • 2.2 MySQL在 Mac 环境下的安装
    • 2.3 MySQL在 Windows 环境下的安装
  • 3. MySQL的基本使用
    • 3.1 使用 MySQL Workbench 管理数据库
      • 3.1.1连接数据库
      • 3.1.2 MySQL主界面的组成
      • 3.1.3 创建数据库
      • 3.1.4 创建数据表
        • DataType 数据类型:
        • 字段的特殊标识:
      • 3.1.5 向表中写入数据
    • 3.2 使用 SQL 管理数据库
      • 3.2.1 什么是 SQL
      • 3.2.2 SQL能做什么
      • 3.2.3 SQL学习目标
    • 3.3 SQL的 SELECT 语句
      • 3.3.1 语法
      • 3.3.2 SELECT * 示例
      • 3.3.3 SELECT 列名称 示例
    • 3.4 SQL 的 INSERT INTO 语句
      • 3.4.1 语法
      • 3.4.2 INSERT INTO 示例
    • 3.5 SQL 的 UPDATE 语句
      • 3.5.1 语法
      • 3.5.2 2. UPDATE示例:更新某一行中的一个列
      • 3.5.3 3. UPDATE示例 - 更新某一行中的若干列
    • 3.6 SQL 的 DELETE 语句
      • 3.6.1 语法
      • 3.6.2 2. DELETE示例
    • 3.7 SQL 的 WHERE 子句
      • 3.7.1 语法
      • 3.7.2 可在 WHERE 子句中使用的运算符
      • 3.7.3 WHERE子句示例
    • 3.8 SQL的 AND 和 OR 运算符
      • 3.8.1 语法
      • 3.8.2 运算符示例
        • 3.8.2.1 AND 运算符
        • 3.8.2.2 OR运算符
    • 3.9 SQL 的 ORDER BY 子句
      • 3.9.1 语法
      • 3.9.2 ORDER BY子句- 升序排序
      • 3.9.3 ORDER BY 子句-降序排序
      • 3.9.4 4. ORDER BY子句-多重排序
    • 3.10 SQL 的 COUNT(*) 函数
      • 3.10.1 语法
      • 3.10.2 COUNT(*)示例
      • 3.10.3 使用 as 为列设置别名
  • 4. 在项目中操作 MySQL
    • 4.1 在项目中操作数据库的步骤
    • 4.2 安装与配置 mysql 模块
      • 4.2.1 安装 mysql 模块
      • 4.2.2 配置 mysql 模块
      • 4.2.3 测试 mysql 模块能否正常工作
    • 4.3使用 mysql 模块操作 MySQL 数据库
      • 4.3.1 查询数据
      • 4.3.2 插入数据
      • 4.3.3 插入数据的便捷方式
      • 4.3.4 更新数据
      • 4.3.5 更新数据的便捷方式
      • 4.3.6 删除数据
      • 4.3.7 标记删除
  • 5. 前后端的身份认证
    • 5.1 Web开发模式
      • 5.1.1 服务端渲染的Web开发模式
      • 5.1.2 服务端渲染的优缺点
      • 5.1.3 前后端分离 的 Web 开发模式
      • 5.1.4 前后端分离的优缺点
      • 5.1.5 如何选择 Web 开发模式
    • 5.2 身份认证
      • 5.2.1 什么是 身份认证
      • 5.2.2 为什么需要身份认证
      • 5.2.3 不同开发模式下的 身份认证
    • 5.3 Session 认证机制
      • 5.3.1 HTTP协议的无状态性
      • 5.3.2 如何突破 HTTP 无状态的限制
      • 5.3.3 什么是 COOKIE
      • 5.3.4 COOKIE 在身份认证中的作用
      • 5.3.5 COOKIE不具有安全性
      • 5.3.6 提高 身份认证的 安全性
      • 5.3.7 Session 的工作原理
    • 5.4 在 Express 中使用 Session 认证
      • 5.4.1 安装express-session中间件
      • 5.4.2 配置express-session中间件
      • 5.4.3 向 session 中存数据
      • 5.4.4 从 session 中取数据
      • 5.4.5 清空 session
    • 5.5 JWT认证机制
      • 5.5.1 了解 Session 认证的局限性
      • 5.5.2 什么是 JWT
      • 5.5.3 JWT的工作原理
      • 5.5.4 4. JWT的组成部分
      • 5.5.5 JWT的三个部分各自代表的含义
      • 5.5.6 JWT的使用方式
    • 5.6 在 Express 中使用 JWT
      • 5.6.1 安装JWT相关的包
      • 5.6.2 导入 JWT 相关的包
      • 5.6.3 定义 secret 密钥
      • 5.6.4 在登录成功后生成 JWT 字符串
      • 5.6.5 将 JWT 字符串 还原为 JSON 对象
      • 5.6.6 使用 req.user 获取用户信息
      • 5.6.7 捕获解析 JWT 失败后产生的错误




1. 数据库的基本概念




1.1 什么是数据库

数据库(database )是用来 组织存储管理 数据的仓库。当今世界是一个充满着数据的互联网世界,充斥着大量的数据数据的来源 有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。

为了方便管理互联网世界中的数据,就有了数据库管理系统 的概念(简称:数据库)。用户可以对数据库中的数据进行 新增查询 更新 删除 等操作。


1.2 常见的数据库及分类

市面上的数据库有很多种,最常见的数据库有如下几个:


  • MySQL 数据库(目前 使用最广泛 、 流行度最高 的开源免费数据库;Community + Enterprise
  • Oracle 数据库(收费)
  • SQL Server 数据库(收费)
  • Mongodb 数据库( Community + Enterprise)

其中,MySQL 、 Oracle 、 SQL Server 属于 传统型数据库 (又叫做 关系型数据库SQL 数据库 ),这三者的设计理念相同,用法比较类似。

而Mongodb 属于 新型数据库 (又叫做 非关系型数据库NoSQL 数据库 ),它在一定程度上弥补了传统型数据库的缺陷。


1.3 传统型数据库的数据组织结构

数据的组织结构:指的就是数据以什么样的结构进行存储。

传统型数据库的数据组织结构,与Excel 中数据的组织结构比较类似。

因此,我们可以对比着Excel 来了解和学习传统型数据库的数据组织结构。


1.3.1 Excel的数据组织结构

每个Excel 中,数据的组织结构分别为 工作簿工作表数据行 四大部分组成。

在这里插入图片描述


  1. 整个 Excel 叫做 工作簿;
  2. users 和 books 是 工作表;
  3. users 工作表中有 3 行数据;
  4. 每行数据由 6 列信息组成;
  5. 每列信息都有对应的 数据类型;

1.3.2 传统型数据库的数据组织结构

在传统型数据库中,数据的组织结构分为数据库 ( database)数据表 ( table)数据行 ( row)字段 ( field)这 4 大部分组成。


  1. 数据库 类似于 Excel 的 工作簿;
  2. 数据表 类似于 Excel 的 工作表;
  3. 数据行 类似于 Excel 的 每一行数据;
  4. 字段 类似于 Excel 的 ;
  5. 每个字段都有对应的数据类型

1.3.3 实际开发中库、表、行、字段的关系


  1. 在实际项目开发中,一般情况下,每个项目都对应 独立的数据库 ;
  2. 不同的数据,要存储到数据库的不同表中,例如:用户数据存储到 users 表中,图书数据存储到 books 表中;
  3. 每个表中具体存储哪些信息,由字段来决定,例如:我们可以为 users 表设计 id 、 username 、 password 这 3 个字段;
  4. 表中的行,代表每一条具体的数据。


2. 安装并配置MySQL


2.1 了解需要安装哪些 MySQL 相关的软件

对于开发人员来说,只需要安装 MySQL ServerMySQL Workbench 这两个软件,就能满足开发的需要了。


  • MySQL Server:专门用来提供数据存储和服务的软件
  • MySQL Workbench:可视化的 MySQL 管理工具 ,通过它,可以方便的操作存储在 MySQL Server 中的数据。

2.2 MySQL在 Mac 环境下的安装

在Mac 环境下安装 MySQL 的过程比 Windows 环境下的步骤简单很多:


  1. 先运行 mysql 8.0.19 macos10.15 x86_64.dmg 这个安装包,将 MySQL Server 安装到 Mac系统;
  2. 再运行 mysql workbench community 8.0.19 macos x86_64.dmg 这个安装包,将可视化的 MySQLWorkbench 工具安装到 Mac 系统。

具体的安装教程,可以参考《MySQL在Mac环境下的安装》=> 点击前往




2.3 MySQL在 Windows 环境下的安装

在Windows 环境下安装 MySQL ,只需要运行 mysql installer community 8.0.19.0.msi 这个安装包,就能一次性将 MySQL Server 和 MySQL Workbench 安装到自己的电脑上。

具体的安装教程,可以参考 《MySQL在 Windows 环境下的安装》=> 点击前往




3. MySQL的基本使用




3.1 使用 MySQL Workbench 管理数据库


3.1.1连接数据库

在这里插入图片描述


3.1.2 MySQL主界面的组成

在这里插入图片描述


3.1.3 创建数据库

在这里插入图片描述


3.1.4 创建数据表

在这里插入图片描述


DataType 数据类型:

① int 整数
② varchar len ) 字符串
③ tinyint 1 ) 布尔值

字段的特殊标识:

① PK Primary Key 主键、唯一标识
② NN Not Null 值不允许为空
③ UQ Unique 值唯一
④ AI Auto Increment 值自动增长



3.1.5 向表中写入数据

在这里插入图片描述


3.2 使用 SQL 管理数据库


3.2.1 什么是 SQL

SQL(英文全称 Structured Query Language )是 结构化查询语言 ,专门用来 访问和处理数据库 的编程语言。能够让我们 以编程的形式,操作数据库里面的数据


三个关键点:


  1. SQL 是一门 数据库编程语言;
  2. 使用 SQL 语言编写出来的代码,叫做 SQL 语句;
  3. SQL 语言 只能在关系型数据库中使用 (例如 MySQL 、 Oracle 、 SQL Server )。非关系型数据库(例如 Mongodb)不支持 SQL 语言。

3.2.2 SQL能做什么


  1. 从数据库中 查询数据;
  2. 向数据库中 插入新的数据;
  3. 更新 数据库中的 数据;
  4. 从数据库 删除数据;
  5. 可以创建新数据库;
  6. 可在数据库中创建新表;
  7. 可在数据库中创建存储过程、视图;
  8. etc…



3.2.3 SQL学习目标

重点掌握如何使用 SQL 从数据表中:

查询数据(select)、 插入数据(insert into)、 更新数据(update)、 删除数据(delete)。

额外需要掌握的 4 种 SQL 语法:

where条件 andor 运算符order by 排序 count(*) 函数




3.3 SQL的 SELECT 语句


3.3.1 语法

SELECT语句用于 从表中查询数据 。执行的结果被存储在一个 结果表 中(称为 结果集 )。语法格式如下:

在这里插入图片描述
🔔 注: SQL 语句中的 关键字大小写不敏感 。 SELECT 等效于 select FROM 等效于 from 。




3.3.2 SELECT * 示例

我们希望从 users 表中选取所有的列,可以使用 符号 * 取代列的名称,示例如下:

在这里插入图片描述


3.3.3 SELECT 列名称 示例

如需获取名为 "username " 和 "password " 的列的内容(从名为 “users” 的数据库表),请使用下面的 SELECT 语句:

在这里插入图片描述






3.4 SQL 的 INSERT INTO 语句




3.4.1 语法

INSERT INTO 语句用于 向数据表中 插入新的数据行 ,语法格式如下:

在这里插入图片描述


3.4.2 INSERT INTO 示例

向 users 表中,插入一条 usernametony stark password098123 的用户数据,示例如下:

在这里插入图片描述


3.5 SQL 的 UPDATE 语句


3.5.1 语法

Update 语句用于 修改表中的数据 。语法格式如下:

在这里插入图片描述


3.5.2 2. UPDATE示例:更新某一行中的一个列

把 users 表中 id7 的用户密码,更新为 888888 。示例如下:

在这里插入图片描述


3.5.3 3. UPDATE示例 - 更新某一行中的若干列

把 users 表中 id 2用户密码用户状态 ,分别更新为 admin1231 。示例如下:

在这里插入图片描述


3.6 SQL 的 DELETE 语句


3.6.1 语法

DELETE 语句用于删除表中的行。语法格式如下:

在这里插入图片描述


3.6.2 2. DELETE示例

从 users 表中,删除 id4 的用户,示例如下:

在这里插入图片描述


3.7 SQL 的 WHERE 子句


3.7.1 语法

WHERE 子句 用于 限定选择的标准 。在 SELECTUPDATEDELETE 语句中, 皆可使用 WHERE 子句来限定选择的标准。

在这里插入图片描述


3.7.2 可在 WHERE 子句中使用的运算符

下面的运算符可在 WHERE 子句中使用,用来限定选择的标准:


操作符描述
=等于
<>不等于
>大于
<小于
>&#61;大于等于
<&#61;小于等于
BETWEEN在某个范围内
LIKE搜索某种模式

&#x1f514; 注&#xff1a; 在某些版本的SQL 中&#xff0c;操作符 <> 可以写为 !&#61;


3.7.3 WHERE子句示例

可以通过 WHERE 子句来限定 SELECT 的查询条件&#xff1a;

在这里插入图片描述


3.8 SQL的 AND 和 OR 运算符


3.8.1 语法

AND 和 OR 可 在 WHERE 子语句把两个或多个条件结合起来

AND 表示 必须同时满足多个条件 &#xff0c;相当于 Javascript 中的 && 运算符&#xff0c;例如 if (a !&#61;&#61; 10 && a !&#61;&#61; 20);

OR 表示 只要满足任意一个条件即可 &#xff0c;相当于 Javascript 中的 || 运算符&#xff0c;例如 if(a !&#61;&#61; 10 || a !&#61;&#61; 20)


3.8.2 运算符示例


3.8.2.1 AND 运算符

使用 AND 来显示所有 status &#61; 0&#xff0c;并且 id <3 的用户&#xff1a;

在这里插入图片描述


3.8.2.2 OR运算符

使用 OR 来显示所有status &#61; 1&#xff0c;或者 username &#61; &#39;zs&#39; 的用户&#xff1a;

在这里插入图片描述


3.9 SQL 的 ORDER BY 子句


3.9.1 语法

ORDER BY 语句用于 根据指定的列 对结果集进行排序
ORDER BY 语句 默认 按照 升序 对记录进行排序。

如果您希望按照 降序 对记录进行排序&#xff0c;可以使用 DESC 关键字。


3.9.2 ORDER BY子句- 升序排序

对users 表中的数据&#xff0c;按照 status 字段进行升序排序&#xff0c;示例如下&#xff1a;

在这里插入图片描述


3.9.3 ORDER BY 子句-降序排序

对 users 表中的数据&#xff0c;按照 id 字段进行降序排序&#xff0c;示例如下&#xff1a;

在这里插入图片描述


3.9.4 4. ORDER BY子句-多重排序

对 users 表中的数据&#xff0c;先按照 status 字段进行 降序排序 &#xff0c;再按照 username字母顺序 &#xff0c;进行 升序排序 &#xff0c;示例如下&#xff1a;

在这里插入图片描述


3.10 SQL 的 COUNT(*) 函数


3.10.1 语法

COUNT(*) 函数用于返回 查询结果总数据条数 &#xff0c;语法格式如下&#xff1a;

在这里插入图片描述


3.10.2 COUNT(*)示例

查询 users 表中 status0 的总数据条数&#xff1a;

在这里插入图片描述


3.10.3 使用 as 为列设置别名

如果希望给查询出来的列名称设置别名&#xff0c;可以使用 AS 关键字&#xff0c;示例如下&#xff1a;

在这里插入图片描述


4. 在项目中操作 MySQL




4.1 在项目中操作数据库的步骤


  1. 安装操作 MySQL 数据库的第三方模块&#xff08;mysql&#xff09;&#xff1b;
  2. 通过 mysql 模块 连接到 MySQL 数据库&#xff1b;
  3. 通过 mysql 模块 执行 SQL 语句

在这里插入图片描述


4.2 安装与配置 mysql 模块


4.2.1 安装 mysql 模块

mysql 模块是托管于 npm 上的 第三方模块 。它提供了在 Node.js 项目中 连接操作 MySQL 数据库的能力。

要在项目中使用它&#xff0c;需要先运行如下命令&#xff0c;将mysql 安装为项目的依赖包&#xff1a;
在这里插入图片描述


4.2.2 配置 mysql 模块

在使用 mysql 模块操作 MySQL 数据库之前&#xff0c; 必须先对 mysql 模块进行必要的配置 &#xff0c;主要的配置步骤如下&#xff1a;
在这里插入图片描述


4.2.3 测试 mysql 模块能否正常工作

调用 db.query () 函数&#xff0c;指定要执行的 SQL 语句&#xff0c;通过回调函数拿到执行的结果&#xff1a;
在这里插入图片描述


4.3使用 mysql 模块操作 MySQL 数据库


4.3.1 查询数据

查询 users 表中所有的数据&#xff1a;
在这里插入图片描述


4.3.2 插入数据

向 users 表中新增数据&#xff0c; 其中 usernameSpider-Man passwordpcc321 。示例代码如下&#xff1a;
在这里插入图片描述


4.3.3 插入数据的便捷方式

向表中新增数据时&#xff0c;如果 数据对象的每个属性数据表的字段 一 一对应 &#xff0c;则可以通过如下方式快速插入数据&#xff1a;
在这里插入图片描述


4.3.4 更新数据

可以通过如下方式&#xff0c;更新表中的数据&#xff1a;
在这里插入图片描述


4.3.5 更新数据的便捷方式

更新表数据时&#xff0c;如果 数据对象的每个属性数据表的字段 一 一对应 &#xff0c;则可以通过如下方式快速更新表数据&#xff1a;

在这里插入图片描述


4.3.6 删除数据

在删除数据时&#xff0c;推荐根据 id 这样的唯一标识&#xff0c;来删除对应的数据。示例如下&#xff1a;

在这里插入图片描述


4.3.7 标记删除

使用 DELETE 语句&#xff0c;会把真正的把数据从表中删除掉。为了保险起见&#xff0c; 推荐使用 标记删除 的形式&#xff0c;来模拟删除的动作

所谓的标记删除&#xff0c;就是在表中设置类似于 status 这样的状态字段&#xff0c;来 标记 当前这条数据是否被删除。

当用户执行了删除的动作时&#xff0c;我们并没有执行DELETE 语句把数据删除掉&#xff0c;而是执行了 UPDATE 语句&#xff0c;将这条数据对应的 status 字段标记为删除即可。
在这里插入图片描述


5. 前后端的身份认证


5.1 Web开发模式

目前主流的 Web 开发模式有两种&#xff0c;分别是&#xff1a;


  1. 基于 服务端渲染 的传统 Web 开发模式&#xff1b;
  2. 基于 前后端分离 的新型 Web 开发模式

5.1.1 服务端渲染的Web开发模式

服务端渲染的概念&#xff1a;服务器 发送给客户端的 HTML 页面 &#xff0c;是 在服务器通过字符串的拼接&#xff0c;动态生成的 。因此&#xff0c;客户端不需要使用 Ajax 这样的技术额外请求页面的数据。代码示例如下&#xff1a;
在这里插入图片描述


5.1.2 服务端渲染的优缺点

优点&#xff1a;


  • 前端耗时少。 因为服务器端负责动态生成 HTML 内容&#xff0c;浏览器只需要直接渲染页面即可。尤其是移动端&#xff0c;更省电。
  • 有利于 SEO 。 因为服务器端响应的是完整的 HTML 页面内容&#xff0c;所以爬虫更容易爬取获得信息&#xff0c;更有利于 SEO 。

缺点&#xff1a;


  • 占用服务器端资源。 即服务器端完成 HTML 页面内容的拼接&#xff0c;如果请求较多&#xff0c;会对服务器造成一定的访问压力。
  • 不利于前后端分离&#xff0c;开发效率低。 使用服务器端渲染&#xff0c;则 无法进行分工合作 &#xff0c;尤其对于 前端复杂度高 的项目&#xff0c;不利于项目高效开发。


5.1.3 前后端分离 的 Web 开发模式

前后端分离的概念&#xff1a;前后端分离的开发模式&#xff0c;依赖于 Ajax 技术的广泛应用 。简而言之&#xff0c;前后端分离的 Web 开发模式&#xff0c;就是 后端只负责提供 API 接口&#xff0c;前端使用 Ajax 调用接口 的开发模式。


5.1.4 前后端分离的优缺点

优点&#xff1a;


  • 开发体验好。 前端专注于 UI 页面的开发&#xff0c;后端专注于 api 的开发&#xff0c;且前端有更多的选择性。
  • 用户体验好。 Ajax 技术的广泛应用&#xff0c;极大的提高了用户的体验&#xff0c;可以轻松实现页面的局部刷新。
  • 减轻了服务器端的渲染压力。 因为页面最终是在每个用户的浏览器中生成的。

缺点&#xff1a;

不利于 SEO 。 因为完整的 HTML 页面需要在客户端动态拼接完成&#xff0c;所以爬虫对无法爬取页面的有效信息。&#xff08;解决方案&#xff1a;利用 Vue 、 React 等前端框架的 SSR &#xff08;server side render &#xff09;技术能够很好的解决 SEO 问题&#xff01;&#xff09;


5.1.5 如何选择 Web 开发模式

不谈业务场景而盲目选择使用何种开发模式都是耍流氓


  • 比如企业级网站&#xff0c;主要功能是展示而没有复杂的交互&#xff0c;并且需要良好的 SEO &#xff0c;则这时我们就需要使用服务器端渲染&#xff1b;
  • 而类似后台管理项目&#xff0c;交互性比较强&#xff0c;不需要考虑 SEO &#xff0c;那么就可以使用前后端分离的开发模式。

另外&#xff0c;具体使用何种开发模式并不是绝对的&#xff0c;为了同时兼顾 首页的渲染速度前后端分离的开发效率 &#xff0c;一些网站采用了首屏服务器端渲染 &#43; 其他页面前后端分离的开发模式。


5.2 身份认证


5.2.1 什么是 身份认证

身份认证&#xff08;Authentication &#xff09;又称“身份验证”、“鉴权”&#xff0c;是指 通过一定的手段&#xff0c;完成对用户身份的确认


  • 日常生活中的身份认证随处可见&#xff0c;例如&#xff1a;高铁的验票乘车&#xff0c;手机的密码或指纹解锁&#xff0c;支付宝或微信的支付密码等。
  • 在 Web 开发中&#xff0c;也涉及到用户身份的认证&#xff0c;例如&#xff1a;各大网站的 手机验证码登录邮箱密码登录二维码登录 等。


5.2.2 为什么需要身份认证

身份认证的目的&#xff0c;是为了 确认当前所声称为某种身份的用户&#xff0c;确实是所声称的用户 。例如&#xff0c;你去找快递员取快递&#xff0c;你要怎么证明这份快递是你的。

在互联网项目开发中&#xff0c;如何对用户的身份进行认证&#xff0c;是一个值得深入探讨的问题。例如&#xff0c;如何才能保证网站不会错误的将“马云的存款数额”显示到“马化腾的账户”上。


5.2.3 不同开发模式下的 身份认证

对于服务端渲染前后端分离 这两种开发模式来说&#xff0c;分别有着不同的身份认证方案&#xff1a;


  1. 服务端渲染 推荐使用 Session 认证机制&#xff1b;
  2. 前后端分离 推荐使用 JWT 认证机制



5.3 Session 认证机制


5.3.1 HTTP协议的无状态性

了解HTTP 协议的无状态性是进一步学习 Session 认证机制的必要前提。

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



在这里插入图片描述






5.3.2 如何突破 HTTP 无状态的限制

对于超市来说&#xff0c;为了方便收银员在进行结算时给 VIP 用户打折&#xff0c;超市可以为每个 VIP 用户发放会员卡。



在这里插入图片描述



Note&#xff1a;现实生活中的会员卡身份认证方式 &#xff0c;在 Web 开发中的 专业术语 叫做 COOKIE


5.3.3 什么是 COOKIE

COOKIE是 存储在用户浏览器中的一段不超过 4 KB 的字符串 。它由一个 名称 &#xff08;Name &#xff09;、一个 &#xff08;Value &#xff09;和其它几个用于控制 COOKIE 有效期安全性使用范围可选属性 组成。

不同域名下的 COOKIE 各自独立&#xff0c;每当客户端发起请求时&#xff0c;会自动当前域名下 所有未过期的COOKIE一同发送到服务器。

COOKIE的几大特性&#xff1a;


  • 自动发送&#xff1b;
  • 域名独立&#xff1b;
  • 过期时限&#xff1b;
  • 4KB 限制。



5.3.4 COOKIE 在身份认证中的作用

客户端第一次请求服务器的时候&#xff0c;服务器通过响应头的形式 &#xff0c;向客户端发送一个身份认证的 COOKIE &#xff0c;客户端会自动将 COOKIE 保存在浏览器中。

随后&#xff0c;当客户端浏览器每次请求服务器的时候&#xff0c;浏览器会自动将身份认证相关的 COOKIE 通过请求头的形式发送给服务器&#xff0c;服务器即可验明客户端的身份。

在这里插入图片描述


5.3.5 COOKIE不具有安全性

由于COOKIE 是存储在浏览器中的&#xff0c;而且浏览器也提供了读写 COOKIE 的 API &#xff0c;因此COOKIE 很容易被伪造&#xff0c;不具有安全性。因此不建议服务器将重要的隐私数据&#xff0c;通过 COOKIE 的形式发送给浏览器。



在这里插入图片描述




注&#xff1a; 千万不要使用 COOKIE 存储重要且隐私的数据 &#xff01;比如用户的身份信息、密码等。





5.3.6 提高 身份认证的 安全性

为了防止客户伪造会员卡&#xff0c;收银员在拿到客户出示的会员卡之后&#xff0c;可以在收银机上进行刷卡认证 。只有收银机确认存在的会员卡&#xff0c;才能被正常使用。



在这里插入图片描述



这种 “ 会员卡 &#43; 刷卡认证 ” 的设计理念&#xff0c;就是 Session 认证机制的精髓。


5.3.7 Session 的工作原理



在这里插入图片描述






5.4 在 Express 中使用 Session 认证


5.4.1 安装express-session中间件

在 Express 项目中&#xff0c;只需要安装express-session中间件&#xff0c;即可在项目中使用 Session 认证&#xff1a;
在这里插入图片描述


5.4.2 配置express-session中间件

express-session 中间件安装成功后&#xff0c;需要通过 app.use ()注册 session 中间件 &#xff0c;示例代码如下&#xff1a;
在这里插入图片描述


5.4.3 向 session 中存数据

当 express-session 中间件配置成功后&#xff0c;即可通过 req.session 来访问和使用 session 对象&#xff0c;从而存储用户的关键信息&#xff1a;
在这里插入图片描述


5.4.4 从 session 中取数据

可以直接从req.session 对象上获取之前存储的数据&#xff0c;示例代码如下&#xff1a;
在这里插入图片描述


5.4.5 清空 session

调用 req.session.destroy() 函数&#xff0c;即可清空服务器保存的 session 信息。
在这里插入图片描述


5.5 JWT认证机制


5.5.1 了解 Session 认证的局限性

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

&#x1f514; 注意&#xff1a;

当前端请求后端接口 不存在跨域问题 的时候&#xff0c; 推荐使用 Session 身份认证机制。

当前端需要 跨域请求后端接口的时候&#xff0c;不推荐使用 Session 身份认证机制&#xff0c; 推荐使用 JWT 认证机制。


5.5.2 什么是 JWT

JWT&#xff08;英文全称 JSON Web Token &#xff09;是目前最流行跨域认证解决方案


5.5.3 JWT的工作原理



总



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


5.5.4 4. JWT的组成部分

JWT 通常由三部分组成&#xff0c;分别是Header&#xff08;头部&#xff09;、Payload&#xff08;有效荷载&#xff09;、Signature&#xff08;签名&#xff09;。


三者之间使用英文的“.”分隔&#xff0c;格式如下&#xff1a;
在这里插入图片描述

下面是 JWT 字符串的示例&#xff1a;
在这里插入图片描述


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

JWT的三个组成部分&#xff0c;从前到后分别是 Header 、 Payload 、 Signature 。

其中&#xff1a;


  • Payload 部分 才是真正的用户信息 &#xff0c;它是用户信息经过加密之后生成的字符串
  • HeaderSignature安全性相关 的部分&#xff0c;只是为了保证 Token 的安全性。


在这里插入图片描述






5.5.6 JWT的使用方式

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

此后&#xff0c;客户端每次与服务器通信&#xff0c;都要带上这个JWT 的字符串&#xff0c;从而进行身份认证。推荐的做法是 把 JWT 放在 HTTP请求头的 Authorization 字段中 &#xff0c;格式如下&#xff1a;
在这里插入图片描述


5.6 在 Express 中使用 JWT


5.6.1 安装JWT相关的包

运行如下命令&#xff0c;安装如下 2 个JWT 相关的包&#xff1a;
在这里插入图片描述
其中&#xff1a;


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



5.6.2 导入 JWT 相关的包

使用 require() 函数&#xff0c;分别导入 JWT 相关的两个包&#xff1a;
在这里插入图片描述


5.6.3 定义 secret 密钥

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


  1. 当生成 JWT 字符串的时候&#xff0c;需要使用 secret 密钥对用户的信息 进行加密 &#xff0c;最终得到加密好的 JWT 字符串&#xff1b;
  2. 当把 JWT 字符串解析还原成 JSON 对象的时候&#xff0c;需要使用 secret 密钥 进行解密

在这里插入图片描述


5.6.4 在登录成功后生成 JWT 字符串

调用 jsonwebtoken 包提供的 sign() 方法&#xff0c;将用户的信息加密成 JWT 字符串&#xff0c;响应给客户端&#xff1a;
在这里插入图片描述


5.6.5 将 JWT 字符串 还原为 JSON 对象

客户端每次在访问那些有权限接口的时候&#xff0c;都需要主动通过请求头中的 Authorization 字段 &#xff0c;将 Token 字符串发送到服务器进行身份认证。

此时&#xff0c;服务器可以通过express-wt 这个中间件&#xff0c;自动将客户端发送过来的 Token 解析还原成 JSON 对象&#xff1a;
在这里插入图片描述


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

express-jwt 这个中间件配置成功之后&#xff0c;即可在那些有权限的接口中&#xff0c;使用 req.user 对象&#xff0c;来访问从 JWT 字符串中解析出来的用户信息了&#xff0c;示例代码如下&#xff1a;
在这里插入图片描述


5.6.7 捕获解析 JWT 失败后产生的错误

当使用 express-jwt 解析 Token 字符串时&#xff0c;如果客户端发送过来的 Token 字符串 过期不合法 &#xff0c;会产生一个 解析失败的错误&#xff0c;影响项目的正常运行。我们可以通过 Express 的错误中间件 &#xff0c;捕获这个错误并进行相关的处理&#xff0c;示例代码如下&#xff1a;
在这里插入图片描述


推荐阅读
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • SQL 查询实体优化与实战技巧分享 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • 在分析和解决 Keepalived VIP 漂移故障的过程中,我们发现主备节点配置如下:主节点 IP 为 172.16.30.31,备份节点 IP 为 172.16.30.32,虚拟 IP 为 172.16.30.10。故障表现为监控系统显示 Keepalived 主节点状态异常,导致 VIP 漂移到备份节点。通过详细检查配置文件和日志,我们发现主节点上的 Keepalived 进程未能正常运行,最终通过优化配置和重启服务解决了该问题。此外,我们还增加了健康检查机制,以提高系统的稳定性和可靠性。 ... [详细]
  • 性能测试中的关键监控指标与深入分析
    在软件性能测试中,关键监控指标的选取至关重要。主要目的包括:1. 评估系统的当前性能,确保其符合预期的性能标准;2. 发现软件性能瓶颈,定位潜在问题;3. 优化系统性能,提高用户体验。通过综合分析这些指标,可以全面了解系统的运行状态,为后续的性能改进提供科学依据。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 触发器的稳态数量分析及其应用价值
    本文对数据库中的SQL触发器进行了稳态数量的详细分析,探讨了其在实际应用中的重要价值。通过研究触发器在不同场景下的表现,揭示了其在数据完整性和业务逻辑自动化方面的关键作用。此外,还介绍了如何在Ubuntu 22.04环境下配置和使用触发器,以及在Tomcat和SQLite等平台上的具体实现方法。 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • 深入理解 Java 控制结构的全面指南 ... [详细]
author-avatar
戴安娜DianaKok
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有