目录
0 前言
1 初始化
2 注册登录
2.1 注册
2.1.1 功能:密码加密(2.3.3)
2.1.1.1 操作
2.1.1.2 bcryptjs详解
2.1.2 优化:表单数据验证(2.5)
2.1.2.1 过时代码修正
2.1.2.2 关键操作
0 前言
本章仅记录部分功能代码(以前文章中未涉及的新内容)以及所遇到的问题
详细内容见 项目首页 - api系统 - GitCode 中的指导文档
❗❗❗最终完整代码也会上传至GitCode中,收藏方便查找
注:部分标题后面跟了原文档中的序号,方便查看
1 初始化
此部分暂无内容
2 注册登录
2.1 注册
2.1.1 功能:密码加密(2.3.3)
2.1.1.1 操作
使用 bcryptjs 对用户密码进行加密
安装指定版本的 bcryptjs :
npm i bcryptjs@2.4.3
导入 bcryptjs :
const bcrypt = require('bcryptjs')
在注册用户的处理函数中,确认用户名可用之后,调用 bcrypt.hashSync(明文密码, 随机盐的长度) 方法,对用户的密码进行加密处理:
// 对用户的密码,进行 bcrype 加密,返回值是加密之后的密码字符串
userinfo.password = bcrypt.hashSync(userinfo.password, 10)
2.1.1.2 bcryptjs详解
bcrypt.hashSync 是 `bcrypt` 库中用于同步生成哈希值的函数,在 Node.js 中经常使用该库来对密码等敏感信息进行哈希处理。以下详细介绍 bcrypt.hashSync 函数的参数:
函数
bcrypt.hashSync(data, saltOrRounds);
参数说明
1. data
类型:string
描述:需要进行哈希处理的数据,通常是用户的密码。这是一个必需的参数,代表你要加密的原始文本。
2. saltOrRounds
类型:string 或 number
描述:该参数可以是一个盐值(string 类型),也可以是生成盐的轮数(number 类型)。
当 saltOrRounds 为 number 类型时
它代表生成盐的轮数,也称为成本因子(cost factor)。这个值越大,生成盐和哈希值所花费的时间就越长,安全性也相对更高。推荐的值通常在 10 - 12 之间。
bcrypt 会根据这个轮数自动生成一个随机的盐值,然后使用这个盐值对 data 进行哈希处理。当 saltOrRounds 为 string 类型时
它代表一个预先定义好的盐值。使用自定义盐值时,每次使用相同的盐和数据进行哈希处理,会得到相同的哈希结果。
一般情况下,不建议手动指定盐值,因为 bcrypt 自动生成的随机盐值可以更好地保证安全性。
返回值
bcrypt.hashSync 函数会返回一个包含盐值和哈希值的字符串,这个字符串可以安全地存储在数据库中,用于后续的密码验证。
2.1.2 优化:表单数据验证(2.5)
2.1.2.1 过时代码修正
const joi = require('@hapi/joi') 的写法现在已经失效,
应该这样导入:const joi = require('joi')
2.1.2.2 关键操作
安装 @hapi/joi 包,为表单中携带的每个数据项,定义验证规则:
npm install @hapi/joi@17.1.0
安装 @escook/express-joi 中间件,来实现自动对表单数据进行验证的功能:
npm i @escook/express-joi
常用验证规则:
/*** string() 值必须是字符串* alphanum() 值只能是包含 a-zA-Z0-9 的字符串* min(length) 最小长度* max(length) 最大长度* required() 值是必填项,不能为 undefined* pattern(正则表达式) 值必须符合正则表达式的规则*/
注意:一定要先指定一种数据类型string()或者其他(包括any()),然后才能执行后续操作
导出规则
// 注册和登录表单的验证规则对象
exports.reg_login_schema = {
// 表示需要对 req.body 中的数据进行验证body: {username,password,},}
使用规则
// 1. 导入验证表单数据的中间件
const expressJoi = require('@escook/express-joi')// 2. 导入需要的验证规则对象
const { reg_login_schema } = require('../schema/user')//...router.post('/reguser', expressJoi(reg_login_schema), userHandler.regUser)
持续更新中...