一、koa2 打造安全的用户密码加密机制
- 通过学习,虽然可以对数据库的可以进行插入操作了,但是现在使用的都是普通的明文密码,这在实际工作中是肯定不允许,需要对密码进行加密和加盐的处理。
加密处理 - 密码的加密有很多种加密算法,比如我们使用的MD5加密或者hash256加密算法,其实他们都是hash的算法。就是把你的密码进行一次不可逆的编译,这样就算别人得到了这个密码值,也不能进行直接登录操作。 我们可以通过(http://www.atool.org/hash.php) 网站,直观的看一下加密的算法。
加盐处理 - 有了加密的处理,我们的密码就安全多了,但是有用户的密码设置的太过简单,很好进行暴力破解或者用彩虹表破解,这时候感觉我们的密码又不堪一击了。这时候我们要使用加盐技术,其实就是把原来的密码里,加入一些其他的字符串,并且我们可以自己设置加入字符串的强度。
- 把加盐的数据库密码进行hash处理后,再存入数据库就比较安全了。
当然还有很多更严谨更可靠的加密机制,小伙伴可以自行探索一下,这个项目我们就是用加盐加密的方法处理用户的密码。
bcrypt的使用 - 简介: bcrypt是一种跨平台的文件加密工具。bcrypt 使用的是布鲁斯·施内尔在1993年发布的 Blowfish 加密算法。由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。
用npm 进行安装npm instal --save bcrypt --registry=https://registry.npm.taobao.org
- 这里注意如果你安装失败了,试着是用淘宝源来进行安装,因为bcrypt里边的二进制包的下载可能是被墙掉了。
- 安装完成后就是引入bcrypt
const bcrypt = require('bcrypt')
- 然后是用pre每次进行保存时都进行加盐加密的操作。
//每次存储数据时都要执行 userSchema.pre('save', function(next){ //let user = this console.log(this) bcrypt.genSalt( SALT_WORK_FACTOR,(err,salt)=>{ if(err) return next(err) bcrypt.hash(this.password,salt, (err,hash)=>{ if(err) return next(err) this.password = hash next() }) }) })
二、Koa2的用户操作的路由模块化
- 所有的路由都写在index.js里显然不是正确的选择,这会导致我们的index.js页面越来越臃肿,最后变的没办法维护。我们需要把Koa程序模块化,我们也叫做路由模块化。
安装koa-router - 我们使用npm来安装koa-router,需要注意的是在终端中我们要进入到service文件夹下,然后再输入如下命令:
npm install koa-router --save
- 我现在使用的版本是7.4.0,大家一定要注意一下自己的版本,如果版本不同,可能学习的时候稍有区别。
建一个User.js的文件 - 编写我们User.js文件:
const Router = require ('koa-router') let router = new Router() router.get('/',async(ctx)=>{ ctx.body="这是用户操作首页" }) router.get('/register',async(ctx)=>{ ctx.body="用户注册接口" }) module.exports=router;
让路由模块化
-
首先在index.js的文件顶部,引入koa-router
const Router = require('koa-router')
-
引入我们的user.js模块
let user = require('./appApi/user.js')
-
装载所有子路由
let router = new Router(); router.use('/user',user.routes())
-
加载路由中间件
app.use(router.routes()) app.use(router.allowedMethods())
-
这四步作完了,我们就可以在浏览器中实验一下我们的模块化路由是否起作用了。在浏览器中输入,http://localhost:3000/user,已经可以出现我们设定好的页面了。
总结:通过这种简单的模块化路由机制,我们就实现了文件的分离,当然这并不是最完美的方案,如果对要求比较高的小伙伴,可以看一下egg.js的路由写法或者直接使用egg.js来进行开发。当然现在的这种做法完全可以应付小型项目的开发了。To be continued …