egg.js的egg-jwt生成token做成中間件

做egg.js項目時想生成token,用egg-jwt插件最好了,但是不小心很容易踩到坑。主要主要幾點:

1、把csrf關掉  

config.security = {
    csrf: {
      enable: false,
      ignoreJSON: true
    }
};

2、驗證token寫成中間件

3、前端交互時在headers傳token給後臺  

headers: {'Authorization': `${sessionStorage.getItem('token')}`} //登錄時把後臺傳過來的token傳到sessionStorage裏
注意:千萬不要加Bearer,
寫成headers: {'Authorization': `Bearer ${sessionStorage.getItem('token')}`}會報"message": "invalid token"錯誤。

 

 

以下是大概步驟:

 

1、安裝egg省略,可參考:https://www.cnblogs.com/zzwlong/p/13555926.html

 

2、安裝egg-jwt:

npm install egg-jwt --save 或 cnpm install egg-jwt --save

 

3、配置jwt

1) config\plugin.js
jwt: { enable:
true, package: 'egg-jwt', },

2) config\config.default.js
config.jwt = { //jwt配置項 secret: "123456" }

 

4、擴展那裏的helper.js加添加生成token的方法

app\extend\helper.js
//
生成token getToken() { return this.app.jwt.sign(value, this.app.config.jwt.secret); }

 

5、在egg後臺登錄頁引入生成token的方法,並在authorization設置token  

'use strict';

const Controller = require('egg').Controller;

class LoginController extends Controller {
    async login() {
    const { ctx, app } = this;
    const { username,password } = ctx.request.body;
    const token = ctx.helper.getToken();
    ctx.set({'authorization':token})
    const result = await ctx.service.login.login(username,password);
    ctx.body = result;
    }
}

module.exports = LoginController;

 

6、封裝驗證token的中間件

//middleware/jwtErr.js
module.exports = (options) => {
  return async function jwtErr(ctx, next) {
      const token = ctx.request.header.authorization;
      let decode = '';
      if (token) {
        try {
          // 解碼token
          decode = ctx.app.jwt.verify(token, options.secret);//驗證token
          await next();
          console.log('decode======>',decode);
        } catch (error) {
          ctx.status = 401;
          ctx.body = {
            message: error.message,
          };
          return;
        }
      } else {
        ctx.status = 401;
        ctx.body = {
          message: '沒有token',
        };
        return;
      }
    };
}

 

7、postman請求,請求時headers記得token前不要加Beare和空格

 

差不多就是這樣了,網上好多用egg-jwt的,但好多都是前端請求接口時headers加token時加Bearer 的,我試了會報"message": "invalid token"錯誤,得去掉

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章