egg
egg-cors egg-mysql crypto加密 jsonwebtoken生成token vali
在config/plugin.js 开启插件
'egg-mysql':{
enable: true,
package:'egg-mysql'
},
'egg-cors':{
enable:true,
package:'egg-cors'
},
'egg-validate':{
enable:true,
package:'egg-validate'
}
在config/config.delault.js 注册插件
'cors':{//后端跨域
origin:'*',
allowMethods:'GET,PUT,POST,DELETE'
}
security:{ //关闭防火墙
csrf:{
enable:false
}
}
'validate': {//类型判断
convert: true, // 对参数可以使用 convertType 规则进行类型转换
// validateRoot: false, // 限制被验证值必须是一个对象。
}
创建一个文件夹 db.js
const crypto=require('crypto')
//创建md5加密规则
const md5=(content)=>{
let md5=crypto.createHash('md5')
return md5.update(content).digest('hex')
}
//接收密码状态
const getPassword=(password)=>{
let str=password=${password}&secret=hss
return md5(str)
}
module.exports=getPassword
validate 类型判断
let err= this.app.validator.validate({username:'string',password:'string'},ctx.request.body)
const err = ctx.validate({ user: 'string', pas: 'number' }, ctx.query)
token
axios 拦截 挂载 token
config.headers.authorization=Cookie.get('token')
生成token jwt.sign(data.username, '1902A');
解析token jwt.verify(token, '1902A');
// 获取用户信息
async getUserInfo() {
const { ctx, app } = this;
const { authorization } = ctx.request.headers;
// 获取token
const token = authorization.split(' ')[1];
const username = jwt.verify(token, '1902A');
// // 通过解密后的token 在表中查找用户信息
const data = await app.mysql.get('userlist', { username });
// 删除对象中的密码字段
delete data.password;
ctx.body = {
code: 1,
msg: '请求成功',
data,
};
}
封装鉴权 app/middleware/auth.js
'use strict';
const jwt = require('jsonwebtoken');
module.exports = () => {
return async function auth(ctx, next) {
// 获取前端传来的token
const { authorization } = ctx.request.headers;
// 获取token
const token = authorization.split(' ')[1];
try {
// 尝试运行 try函数
jwt.verify(token, '1902A');
await next();
} catch (error) {
// 如果try函数监听到运行失败 运行catch
console.log('解密失败');
ctx.body = {
code: 0,
msg: '请重修登录',
};
}
};
};
eg:
const { router, controller, middleware } = app;
// 获取用户信息
router.post('/api/userinfo', middleware.auth(), controller.login.getUserInfo);