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