1.安装依赖
npm install egg-cors egg-jwt --save
2.在登陆方法中生成token
public async login() {
const { ctx ,app} = this;
// 获取用户端传递过来的参数,不同的参数传递获取方式不一
const data = ctx.request.body;
console.log(data);
if(data){
const token = app.jwt.sign({
username: data.username, // 需要存储的 token 数据
//......
}, app.config.jwt.secret);
// 返回 token 到前端
ctx.body = token;
}
}
3.修改配置文件
config/plugin.ts
const plugin: EggPlugin = {
// static: true,
// nunjucks: {
// enable: true,
// package: 'egg-view-nunjucks',
// },
jwt: {
enable: true,
package: "egg-jwt"
},
cors: {
enable: true,
package: 'egg-cors',
}
};
config/config.default.ts
// 不需要验证token的路由
config.routerAuth = ['/system/login', '/system/imageCode', "/system/imageCode"]
config.jwt = {
secret: "sue1sue1sue",//自定义 token 的加密条件字符串
};
config.security = {
csrf: {
enable: false,
ignoreJSON: true
},
};
// add your egg config in here, 使用的中间件,这里我们要用自己写的jwt验证
config.middleware = ['auth'];
4.在app\middleware下面新建一个ts文件
module.exports = (options, app) => {
if(options.size>0) console.log(options);
return async function (ctx, next) {
//拿到不需要验证的token的路由
const routerAuth = app.config.routerAuth;
//获取当前路由
let url = ctx.url;
url = url.split("?")[0]
//判断当前路由是否需要验证token
const flag = routerAuth.includes(url)
if (flag) {
await next();
} else {
//获取token,如果没有传入token,则为空
const token = ctx.headers.authorization ? ctx.headers.authorization : '';
token.substring(7) //把Bearer 截取掉,解析的时候不需要加上Bearer
// 解析token
try {
const decode = await app.jwt.verify(token, app.config.jwt.secret);
ctx.state.userinfo = decode;
await next();
} catch (err) {
ctx.status = 401;
ctx.body = {
code: 401,
message: 'token失效或解析错误',
data: null
}
}
}
}
}
这样一来,所有除了在白名单里面的api都会被拦截验证token。