做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"错误,得去掉