用到的扩大
参数校验 egg-valparams
https://www.npmjs.com/package…
// 装置扩大
npm i egg-valparams --save
// 扩大开启 config/plugin.js
valparams : {
enable : true,
package: 'egg-valparams'
},
// 配置扩大 config/config.default.js
config.valparams = {
locale : 'zh-cn',
throwError: false
};
数据加密 crypto
npm install crypto --save
// 配置扩大 config/config.default.js
config.crypto = {secret: 'Z#fOGf$te4^J28l1Z&$#fXCNifv!ZHQnEG'};
// 引入
const crypto = require('crypto');
// 加密
async createPassword(password) {const hmac = crypto.createHash("sha256", this.config.crypto.secret);
hmac.update(password);
return hmac.digest("hex");
}
// 验证明码
async checkPassword(password, hash_password) {
// 先对须要验证的明码进行加密
password = await this.createPassword(password);
return password === hash_password;
}
jwt 加密鉴权
https://www.npmjs.com/package…
npm i egg-jwt --save
// {app_root}/config/plugin.js
exports.jwt = {
enable: true,
package: "egg-jwt"
};
// {app_root}/config/config.default.js
exports.jwt = {secret: 'qhdgw@45ncashdaksh2!#@3nxjdas*_672'};
// 生成 token
async getToken(arr) {return this.app.jwt.sign(arr, this.app.config.jwt.secret);
},
// 验证 token
async checkToken(token) {return this.app.jwt.verify(token, app.config.jwt.secret)
}
用户注册
- 校验参数
- 用户是否存在
- 插入用户数据
async register() {let { ctx, app} = this
let {username,password,repassword} = this.ctx.request.body
// 参数验证
ctx.validate({username: {type: 'string',required: true, desc: '用户名', range: {min: 5,max: 10,}},
password: {type: 'string',required: true,desc: "明码"},
repassword: {type: 'string', required: true,desc: "确定明码"}
}, {equals: [ ['password', 'repassword']]
});
console.log(ctx.paramErrors);
// 校验失败返回
if (ctx.paramErrors) {return ctx.error(ctx.paramErrors, '注册失败')
}
// 用户是否存在
if (await app.model.User.findOne({where: {username}})) {return ctx.error('',' 用户曾经存在,毋庸注册 ')
}
// 插入用户数据
let user = await app.model.User.create({username, password})
if (!user) {return ctx.error('',' 创立用户失败 ')
}
return ctx.success(user, '注册胜利')
}
登录
- 参数校验
- 验证用户是否存在
- 验证明码是否存在
- 生成 token
- 保留 token 并返回
async login() {let { ctx, app} = this
let {username,password} = ctx.request.body
// 参数验证
ctx.validate({username: {type: 'string',required: true, desc: '用户名', range: {min: 5,max: 10,}},
password: {type: 'string',required: true,desc: "明码"},
});
if (ctx.paramErrors) {return ctx.error(ctx.paramErrors, '参数校验不通过')
}
// 验证用户是否存在
let userinfo = await app.model.User.findOne({where: {username}});
if (!userinfo) {return ctx.error('',' 用户不存在 ')
}
// 校验明码是否正确
if(userinfo.password != password){return ctx.error('',' 明码不正确 ')
}
let userinfoarr = JSON.parse(JSON.stringify(userinfo));
// 生成 token
let token =await ctx.getToken(userinfoarr);
// 退出 session/cookie/ 缓存中
ctx.session.userinfo = userinfoarr;
ctx.session.token = token;
// 返回用户信息和 token
return ctx.success({token}, '登陆胜利')
}
登记
也就是 session 清空
async logout() {
// var userinfo=this.ctx.session
this.ctx.session = null;
return ctx.success(userinfo, '登记胜利')
}