1. 程式人生 > 實用技巧 >egg.js的egg-jwt生成token做成中介軟體

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":"invalidtoken"錯誤。

以下是大概步驟:

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":"invalidtoken"錯誤,得去掉