用到的扩展
参数校验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, '注销成功')
}