egg-jwt egg jwt 使用

老子叫甜甜 提交于 2020-01-31 12:00:47

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存的内容

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!