[TOC]
### 基于JSON WEB TOKEN 封装 中间件鉴权
1. 导入 jsonwebtoken 包
文档:[https://www.npmjs.com/package/jsonwebtoken](https://www.npmjs.com/package/jsonwebtoken)
安装:`npm install jsonwebtoken`
*****
2. egg 框架配置
config / config.default.js 中配置 jwt
```
/********** token 配置 **********/
config.jwt = {
secret: 'bcrypt',
expiresIn: 60*60*2 // 2小时过期
}
```
>[danger] secret : token 加密密钥
> expiresIn:token 有效期
app / extend / context.js 扩展 ctx 属性
```
const Cryptojs = require('crypto-js');
const jwt = require('jsonwebtoken');
module.exports = {
get jwt() {
return jwt
},
returnSucc(msg='成功', code=0, httpCode=200) {
throw new global.myErrors(msg, code, httpCode)
},
returnError(msg='失败', code=1, httpCode=400) {
throw new global.myErrors(msg, code, httpCode)
},
crypto(value) {
return Cryptojs.HmacSHA256(value, 'drw_admin888').toString();
}
}
```
*****
3. 配置中间件
app / config / config.default.js
```
/********** 中间件配置 **********/
config.middleware = ['errorHandler', 'auth'];
config.auth = {
allowed: [
'/api/v1/user/register',
'/api/v1/user/login'
]
}
```
>[danger] allowed:不需要token验证的路由
*****
4. 书写中间件
app / middleware / auth.js
```
/**
* token 访问授权
* @param oprions { Array } 配置项:不需要鉴权的路由
* @param app { Object } 当前应用
*/
module.exports = (options, app) => {
return async (ctx, next) => {
// 1.排除不需要验证 token 的路由
if (options.allowed.indexOf(ctx.request.url) > -1) return await next(options);
//2. 获取 header 头token
const { authorization = '' } = ctx.header;
if (!authorization) ctx.returnError('您没有权限访问该接口!', 0, 401);
let token = authorization.replace('Bearer ', '')
//3. 根据token解密,换取用户信息
let user = {};
try {
user = ctx.jwt.verify(token, app.config.jwt.secret)
} catch(err) {
err.name === 'TokenExpiredError' ? ctx.returnError('token 已过期! 请重新获取令牌')
: ctx.returnError('Token 令牌不合法!');
}
//4. 把 user 信息挂载到全局ctx上
ctx.auth = {
uid: user.uid,
scope: user.scope
}
// 5. 继续执行
await next(options);
}
}
```
*****
- 概述
- 起步
- 跨域配置
- 路径别名
- 路由
- api版本控制
- 错误和异常
- 全局异常处理
- 数据库
- 创建迁移文件
- sequelize数据类型
- 配置
- 新增
- 查询
- 条件查询
- 模糊查询
- 排序查询
- 聚合查询
- 分组查询
- 分页查询
- 修改
- 删除
- 获取器
- 修改器
- 静态属性
- 字段验证
- 外键约束
- 关联模型
- 一对一
- 一对多
- 左外连接
- 多对多
- 字段显示隐藏
- 事务
- 字段自增
- 验证层
- egg-validate
- indicative验证器
- egg-validate-plus
- betterValidate
- 校验规则
- 中间件
- 安全
- 数据加密
- 单向加密
- 示例代码
- 封装egg加密
- 上传
- path模块
- 单文件上传
- 多文件上传
- 按照日期存储
- 工具函数
- egg常用工具函数
- 缓存
- 配置缓存插件
- 设置缓存
- 获取缓存
- 删除缓存
- 消息队列
- rabbitMQ
- 安装
- 简单队列
- 工作队列
- 工作队列(dispach分发)
- 消息应答和持久化
- redis
- 数据类型
- 字符串类型(String)
- 哈希类型(Hash)
- 列表(List)
- 无序集合(Set)
- 可排序集合(Zset)
- 邮件系统
- nodeMailer
- 第三方模块
- 生成随机数
- JWT
- JWT鉴权
- 生成Token
- 短信服务
- 阿里大鱼短信验证码
- 发送短信逻辑
- 阿里短信Node类