1,安装egg-jwt
npm install egg-jwt --save
2,配置
config/plugin.ts
import { EggPlugin } from 'egg';
const plugin: EggPlugin = {
jwt: {
enable: true,
package: "egg-jwt"
},
};
export default plugin;
config/config.default.ts
config.jwt = {
secret: "ylw"//自定义 token 的加密条件字符串
};
如果使用了ts,需要在根目录下的
typings/index.d.ts
文件里声明一个any
类型,否则会类型错误:
import 'egg';
declare module 'egg' {
interface Application {
jwt: any;
mysql:any;
}
}
3,使用
在controller中使用:
login.ts
const token = ctx.app.jwt.sign({
...ctx.request.body,
}, this.app.config.jwt.secret, {
expiresIn: '60m', // 时间根据自己定,具体可参考jsonwebtoken插件官方说明
});
调用接口应该会在控制台拿到token:
4,中间件
中间件可以减少代码,方便使用
middleware/jwt.ts
module.exports = options => {
return async function jwt(ctx, next) {
const token = ctx.request.header.authorization;
let decode: any;
if (token) {
try {
// 解码token
decode = ctx.app.jwt.verify(token, options.secret);
await next();
console.log(decode);
} catch (error) {
ctx.status = 401;
ctx.body = {
message: error.message,
};
return;
}
} else {
ctx.status = 401;
ctx.body = {
message: '没有token',
};
return;
}
};
};
5,鉴权
在router中对要鉴权的路由进行注册:
const jwt = app.middleware.jwt(app.config.jwt);
router.get('/', jwt, controller.home.index);
在要调用的接口header加入刚才输入获取的token:
{
Authorization:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IjExMjMzMyIsInBhc3N3b3JkIjoiMTIzNDEyIiwiaWF0IjoxNTgwMzgwNjA3LCJleHAiOjE1ODAzODQyMDd9._qBIrfaiELVdxD6MmWFAXJXDM6WDP3DjAfqk-cpGjl4
}
6,结果
如果调用接口不传:
正确填写token:
将在控制台打印token存的内容