1。安装egg-jwt
npm install egg-jwt --save
2.安装完成后在根目录下的 config/plugin.js 配置一下,如:
module.exports = {
mysql: {
enable: true,
package: 'egg-mysql',
},
jwt: {
enable: true,
package: "egg-jwt"
}
};
3.接下来在 config/config.default.js 里面继续配置:
config.jwt = {
secret: "123456"//自定义 token 的加密条件字符串
};
4.使用jwt生成token,在controller/home.js 中
class HomeController extends Controller {
async login() {
const { ctx,app } = this;
//获取用户端传递过来的参数
const data = ctx.request.body;
//验证账号密码是否正确,然后生成token
const token = app.jwt.sign({
nickname: data.name,//需要存储的 token 数据
}, app.config.jwt.secret);
ctx.body = token;
}
}
5.验证token,在router中对要验证的路由进行注册:
//router.js
module.exports = app => {
const { router, controller, middleware, jwt } = app;
router.post('/home/getUser',jwt,controller.home.getUser);
};
//controller/home.js
async getUser() {
const { ctx } = this;
const token = ctx.request.header.authorization.substring(7); //把Bearer 截取掉,解析的时候不需要加上Bearer
try {
let user = ctx.app.jwt.verify(token, ctx.app.config.jwt.secret) //user为当时存储的数据,iat 为过期时间
} catch (err) {
ctx.status = 401;
ctx.body = {
message: error.message,
};
return;
}
const userId = ctx.query;
const userInfo = await ctx.service.home.getUser(userId);
ctx.body = userInfo;
}
前端请求的时候需要在 headers 里加上默认的验证字段 Authorization。
使用插件验证要在前面加上 Bearer 字符串和一个空格,封装为中间件则不需要
封装为中间件 middleware/auth.js
module.exports = (app) => {
return async function jwt(ctx, next) {
var token = ctx.headers.authorization ? ctx.headers.authorization : '';
try {
// 解码token
let decode = ctx.app.jwt.verify(token, ctx.app.config.jwt.secret);
await next();
console.log(decode);
} catch (error) {
ctx.status = 401;
ctx.body = {
code: 401,
message: 'token失效或解析错误',
data: null
}
return;
}
};
};