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 相关文章推荐
网页里控制图片大小的相关代码
Jun 25 Javascript
Gird事件机制初级读本
Mar 10 Javascript
[推荐]javascript 面向对象技术基础教程
Mar 03 Javascript
JavaScript 替换Html标签实现代码
Oct 14 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
Aug 02 Javascript
JavaScript淡入淡出渐变简单实例
Aug 06 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
Dec 03 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
Jan 04 Javascript
javascript类型系统——undefined和null全面了解
Jul 13 Javascript
Jquery删除css属性的简单方法
Dec 04 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
Oct 29 Javascript
Node.js 在本地生成日志文件的方法
Feb 07 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下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
JQuery 学习笔记 选择器之五
2009/07/23 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
javascript中sort排序实例详解
2016/07/24 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
python list 合并连接字符串的方法
2013/03/09 Python
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
详解flask入门模板引擎
2018/07/18 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
关于初始种子自动选取的区域生长实例(python+opencv)
2020/01/16 Python
解决Python中报错TypeError: must be str, not bytes问题
2020/04/07 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
英国钻石公司:British Diamond Company
2020/02/16 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
2014全国两会学习心得体会2000字
2014/03/10 职场文书
与美同行演讲稿
2014/09/13 职场文书
导游词之介休绵山
2019/12/31 职场文书