安装
npm install egg-jwt
注册插件
'use strict';module.exports = {//mysqlmysql: {enable: true,package: 'egg-mysql'},//jwtjwt: {enable: true,package: 'egg-jwt'}
};
使用中间件
在app文件下创建 middleware 文件夹 在middleware 文件下创建 checktoken.js
module.exports = (option, app) => {return async function(ctx, next) {//获取tokenconst token = ctx.request.header.token || ''try{//解密tokenconst userInfo = await ctx.app.jwt.verify(token, ctx.app.config.security.jwt.key)//将信息存储到ctx上ctx.userInfo = userInfoawait next()}catch(err){ctx.body={code:401,data:err,msg:'token失效'}}}
}
注册checktoken中间件
在 config.default.js 文件中进行注册 名称对应middleware 文件夹下的js名称
登录接口实例
登录接口拿到 账号密码 后 创建token 并返回token
/// 将openid 存入token中 app.config.security.jwt.key, 是一个字符串key 可以根据自己喜好随意设置const token = app.jwt.sign({ openid }, app.config.security.jwt.key,)
const { ctx, app } = this;const data = ctx.request.bodyconst openid = data.openidconst result = await app.mysql.get('wxuser', { openid: data.openid })//创建tokenconst token = app.jwt.sign({ openid }, app.config.security.jwt.key,)console.log('key', app.config.security.jwt.key)if (result) {ctx.body = {code: 200,data: token,msg: '登录成功'}
获取用户信息接口
//直接返回 ctx.userInfo 因为在checktoken.js 中已经将userInfo定义在了ctx上了const {ctx,app} = thisctx.body={code:200,data:{data:ctx.userInfo},msg:'成功'}
判断不需要token拦截的接口
一般除了登录接口不需要token 其他接口都需要token校验 代码
checktoken:{match(ctx){//获取登录apiconst url = ctx.request.urlif(withoutApi.includes(url)){return false}else{return true}}}
withoutApi 数组里面的接口都不需要经过中间件了