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 相关文章推荐
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
Dec 23 Javascript
jQuery中filter()和find()的区别深入了解
Sep 25 Javascript
自己用jQuery写了一个图片的马赛克消失效果
May 04 Javascript
百度地图API之本地搜索与范围搜索
Jul 30 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
Sep 06 Javascript
浅谈js多维数组和hash数组定义和使用
Jul 27 Javascript
angularjs2中父子组件的数据传递的实例代码
Jul 05 Javascript
在vue中使用G2图表的示例代码
Mar 19 Javascript
JQuery特殊效果和链式调用操作示例
May 13 jQuery
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
Jun 27 Javascript
vuejs中父子组件之间通信方法实例详解
Jan 17 Javascript
js cavans实现静态滚动弹幕
May 21 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
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
深入php数据采集的详解
2013/06/02 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
2013/08/06 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
php实现用户登陆简单实例
2017/04/04 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
2018/04/12 PHP
javascript(js)的小数点乘法除法问题详解
2014/03/07 Javascript
JavaScript中的style.cssText使用教程
2014/11/06 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
2016/10/28 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
mpvue写一个CPASS小程序的示例
2018/09/04 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
python处理圆角图片、圆形图片的例子
2014/04/25 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
python读写csv文件实例代码
2019/07/05 Python
python实现ip地址查询经纬度定位详解
2019/08/30 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
Django多个app urls配置代码实例
2020/11/26 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
用python计算文件的MD5值
2020/12/23 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
android面试问题与答案
2016/12/27 面试题
开办大学饮食联盟创业计划书
2014/01/29 职场文书
解除劳动合同协议书
2014/04/14 职场文书
中英文求职信范文
2015/03/19 职场文书
通知书大全
2015/04/27 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书