egg.js的egg-jwt生成token做成中介軟體
阿新 • • 發佈:2020-09-08
做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"錯誤,得去掉