建免费的网站,wordpress 分类 文章数,网站建设推广合同范本,网站方案制作的培训node ORM #xff08;sequelize#xff09;使用、查询、验证及express 基础框架的搭建及实例的使用
一、思路 第一步#xff1a;肯定是用户要向接口传递邮箱、账号和密码了。 第二步#xff1a;接口这边#xff0c;先要验证。因为这里不是往数据库里存储数据#xff0c;…node ORM sequelize使用、查询、验证及express 基础框架的搭建及实例的使用
一、思路 第一步肯定是用户要向接口传递邮箱、账号和密码了。 第二步接口这边先要验证。因为这里不是往数据库里存储数据所以模型中的验证是用不了的。我们可以自己在路由里写点判断确定用户提交了邮箱、账号和密码而且不为空。 第三步因为用户既可以用账号登录也可以用邮箱登录。那我们接收数据的时候就不要接收email和username了。可以接收一个自定义的东西就叫做login无论发送的是邮箱还是账号都用login来接受。 第四步用接收到的这个login来查询数据库判断当前用户是否存在。无论是查询邮箱还是查询账号只要查到那就是存在。 第五步如果找到当前用户了再来比对密码是否正确。 第六步就算账号和密码都对得上还要验证当前用户是不是管理员。因为后台只有管理员才能登录普通用户是没有这种权限的。 第七步如果以上都成功了。就要用一个叫做jwt的包来生成token也就是令牌。前端拿到这个token后才能访问需要认证的接口。 包安装
//密码加密
npm i bcryptjs
生成token
npm i jsonwebtoken
专门用来管理环境变量
npm i dotenv
// 创建 HTTP 错误
http-errors
二、auth路由文件封装
const express require(express);
const router express.Router();
const { User } require(../../models);
const { Op } require(sequelize);
const { BadRequest, Unauthorized, NotFound } require(http-errors);
const { success, failure } require(../../utils/responses);
const bcrypt require(bcryptjs);
const jwt require(jsonwebtoken);/*** 管理员登录* POST /admin/auth/sign_in*/
router.post(/sign_in, async (req, res) {try {const { login, password } req.body;if(!login) {throw new BadRequest(邮箱/用户名必须填写。);}if(!password) {throw new BadRequest(密码必须填写。);}const condition {where: {[Op.or]: [{ email: login },{ username: login }]}};// 通过email或username查询用户是否存在const user await User.findOne(condition);if (!user) {throw new NotFound(用户不存在无法登录。);}// 验证密码const isPasswordValid bcrypt.compareSync(password, user.password);if (!isPasswordValid) {throw new Unauthorized(密码错误。);}// 验证是否管理员if (user.role ! 100) {throw new Unauthorized(您没有权限登录管理员后台。);}// 生成身份验证令牌const token jwt.sign({userId: user.id}, process.env.SECRET, { expiresIn: 30d });success(res, 登录成功。, { token });} catch (error) {failure(res, error);}
});module.exports router;
三、app.js引入
// dotenv 必须放在所有的路由前面
require(dotenv).config();// 路由引入
const adminAuthRouter require(./routes/admin/auth);
app.use(/admin/auth, adminAuthRouter);四、根目录创建一个.env文件 生成密钥
1 、自定义生成
SECREThello2、随机生成
1.在路由的顶部引用crypto这个模块是Node.js自带的无需安装。
const crypto require(crypto);2.然后去使用crypto模块在登录方法的顶部生成一个 32 位长的随机字符串并打印出来。 console.log(crypto.randomBytes(32).toString(hex));3.重新调用下接口检查命令行里可以看到已经生成成功了。我们将这一段复制到.env文件中就好了。
4.完成后别忘了修改环境变量后一定要重启服务。开发完成之后代码里关于crypto的也都可以删掉了。