koa2 用户注册、登录校验与加盐加密的实现方法


Posted in Javascript onJuly 22, 2019

加密与解密

 先介绍一下关于服务端用户名跟密码的存储状态,我们知道当前端在注册一个新用户时,会在表单内填入用户名和密码,并通过post请求提交到服务器,服务器再把用户名和密码从ctx.request.body中拿出来,存入到数据库的一张表里。这张表通常会被命名为users。

关键在于,服务器如何存入用户名和密码到数据库。直接存?不可能的,这样太不安全了,永远不要在一张表中出现全部用户名和密码一览无余的危险情况。

所以比较好的处理方法是这样的,服务器先对用户的密码进行加盐加密,再存到数据库。

那密码验证呢?则是接收前端输入的明文密码,与数据库中相应的加密密码进行比对,如果正确,则表示登录成功。注意:如果有人拿到这个加密的密码,也是没用的。因为比对正误的方法已经在服务器写死,只能是比对明文密码与加密密码是否吻合。如果接收到两个一模一样的加密密码,验证也不会通过。

至于如何比对明文密码与加密密码,不用担心,加密解密的方法都是一起配对生产的。bcryptjs就是这样一款不错的加解密工具。(因为在windows上安装bcrypt会报错,据说其他系统没问题,所以改为安装bcryptjs,其api和使用方法与bcrypt完全一样)

koa2 用户注册、登录校验与加盐加密的实现方法

我在一个js模块中定义了两个方法,一个加密,一个解密。在加密算法中,首先我们需要生成盐,所谓盐,就是先在明文密码中混入一些无规则的字符。传入的数字越大,代表混入的盐越复杂。最后通过hashSync方法生成加密密码并返回。而解密方法就更加简单,直接调用封装的compareSync方法进行明文密码与加密密码比对。

用户注册

在服务端路由模块,暴露一个register接口,用于接收前端注册信息,对密码进行加盐加密,并存入数据库的操作。

const router = require("koa-router")();
const UserModel = require("../schema/user");
const Crypt = require("./crypt");
const jwt = require("jsonwebtoken");
// 新增一名用户
router.post("/register", async ctx => {
 const UserEntity = new UserModel(ctx.request.body);
 UserEntity.password = Crypt.encrypt(UserEntity.password);
 await UserEntity.save()
 .then(() => {
  ctx.body = {
  code: 200,
  msg: "register successfuly"
  };
 })
 .catch(() => {
  ctx.body = {
  code: 500,
  msg: "register failed"
  };
 });
});

(看一下我这段代码,有几个需要说明的地方:第一,我是通过userModel这一个模型的save方法将这条数据存入mongoDB数据库中,至于model、schema的概念问题,先不在这里赘述;第二:存储失败的原因可能是网络问题,服务端程序出错,但最大的可能还是因为我在userSchema里定义了用户名的不可重复性,也就是所谓的“该用户名已存在”)。

为了阐述方便,这里将userModel的定义代码贴出来:

koa2 用户注册、登录校验与加盐加密的实现方法

登录校验

让我们回到服务端路由模块,看下怎样去完成一个登录校验。

// 登录校验
router.post("/login", async ctx => {
 const data = ctx.request.body;
 await UserModel.findOne({ account: data.account })
 .then(res => {
  const checkPassword = Crypt.decrypt(data.password, res.password);
  if (checkPassword) {
  const token = jwt.sign({ account: res.account }, "zhangnan", {
   expiresIn: "2h"
  });
  ctx.body = { code: 200, msg: "successfuly login", token: token };
  } else {
  ctx.body = { code: 500, msg: "wrong password" };
  }
 })
 .catch(() => {
  ctx.body = { code: 501, msg: "user does not exist" };
 });
});

首先,我们根据用户输入的用户名去数据库查找用户信息,如果查不到,说明用户名不存在,这是第一层逻辑。

如果查到了,则调用刚刚定义好的解密方法进行明文密码与加密密码比对,如错误,则告诉前端密码错误;如正确,则调用jwt的sign方法签发一个token给前端。签发的内容是用户名;后面前端再发来请求并携带这个token时,如果验证到token有效,那解析出来的用户名就是服务器判断前端请求身份的标识,它告诉服务器“我是xxx,且我处于已登录状态”。这是第二层逻辑。

总结

以上所述是小编给大家介绍的koa2 用户注册、登录校验与加盐加密的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jquery解析XML字符串和XML文件的方法说明
Feb 21 Javascript
javascript动态控制服务器控件实例
Sep 05 Javascript
使用JavaScript链式编程实现模拟Jquery函数
Dec 21 Javascript
浅谈js中的in-for循环
Jun 28 Javascript
详解js中==与===的区别
Jan 08 Javascript
JS出现失效的情况总结
Jan 20 Javascript
Vue通过input筛选数据
Oct 26 Javascript
Angular4学习笔记之新建项目的方法
Jul 18 Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
Jul 19 Javascript
JS实现点击循环切换显示内容的方法
Oct 19 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
Mar 29 Javascript
js最全的数组的降维5种办法(小结)
Apr 28 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
Jul 22 #Javascript
在小程序中推送模板消息的实现方法
Jul 22 #Javascript
javascript自定义日期比较函数用法示例
Jul 22 #Javascript
详解微信小程序自定义组件的实现及数据交互
Jul 22 #Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
Jul 22 #Javascript
详解vue为什么要求组件模板只能有一个根元素
Jul 22 #Javascript
微信小程序获取用户绑定手机号方法示例
Jul 21 #Javascript
You might like
Home Coffee Roasting
2021/03/03 咖啡文化
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
php把session写入数据库示例
2014/02/26 PHP
PHP中echo,print_r与var_dump区别分析
2014/09/29 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
PHP实现的曲线统计图表示例
2016/11/10 PHP
JS实现self的resend
2010/07/22 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
jquery提交form表单时禁止重复提交的方法
2014/02/13 Javascript
js定时器(执行一次、重复执行)
2014/03/07 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
js实现select组件的选择输入过滤代码
2014/10/14 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
2015/04/02 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
人工神经网络算法知识点总结
2019/06/11 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
Lookfantastic日本官网:英国知名护肤、化妆品和头发护理购物网站
2018/04/21 全球购物
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
大学生应聘自荐信
2013/10/11 职场文书
离婚财产处理协议书
2014/09/30 职场文书
入党政审材料范文
2014/12/24 职场文书
优秀班组事迹材料
2014/12/24 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
财政局长个人总结
2015/03/04 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL
如何Tomcat中使用ipv6地址
2022/05/06 Servers