1,安装egg-jwt
npm install egg-jwt --save
2,配置
config\plugin.js
jwt: { //jwt插件启用
enable: true,
package: 'egg-jwt',
},
config\config.default.js
config.jwt = { //jwt加盐以及设置过期时间
secret: 'jwt',
expiresIn:'1h'
};
3.生成token
app\controller\api\home.js
const token = ctx.app.jwt.sign({
name:result.dataValues.name,uid:result.dataValues.id,status:result.dataValues.status //储存参数
}, this.app.config.jwt.secret, {
expiresIn:this.app.config.jwt.expiresIn, //过期时间
});
4.验证token
app\middleware\jwtValidate.js
'use strict';
module.exports = (options, app) => {
return async function (ctx, next) {
//拿到不需要验证的token的路由
const routerAuth = [ //白名单
"api",
"home"
];
//获取当前路由
const url = ctx.url;
var strs = new Array(); //定义一数组
strs = url.split("/"); //字符分割
//判断当前路由是否需要验证token
const flag = routerAuth.includes(strs[2]?strs[2]:strs[1]) //根据模块来判定白名单
// const flag = routerAuth.includes(url) //根据模块来判定白名单
if (flag) {
await next();
} else {
//获取token,如果没有传入token,则为空
// console.log(ctx.headers, "获取请求头")
var token = ctx.headers.token ? ctx.headers.token : '';
// var token = ctx.headers.authorization ? ctx.headers.authorization : ''; //请求头字段为 authorization时使用
// token = token.substring(7) //把Bearer 截取掉,解析的时候不需要加上Bearer
console.log(token, "获取thonk")
// 解析token
try {
console.log(token, app.config.jwt.secret)
const decode = await app.jwt.verify(token, app.config.jwt.secret);
// console.log(decode, "解析token")
ctx.user = {
uid: decode.uid,
name: decode.name,
status: decode.status,
};
if (decode.status != 1) {
ctx.body = {
code: 401,
message: '该用户已被停用',
data: null
}
} else {
await next();
}
} catch (err) {
app.logger.debug(err); //打印错误日志
ctx.body = {
code: 401,
message: 'token失效或解析错误',
data: null
}
}
}
}
}
白名单我用的是类名通配,如果要细化到url 去掉分割就好
5.启用中间件
config\config.default.js
config.middleware = ["jwtValidate"];