在我们的设计中,HttpGateway(网关)实现如下功能:
- Http请求互转
接收来自Internet的Http请求,经过转换后向内部ZeroNet发起请求,请求完成后,将来自ZeroNet的请求结果(ApiResult)以JSON格式返回 - 安全检查
Internet是一个不安全的环境,仅靠防火墙并不能完全抵挡恶意请求,所以我们还对Http请求进行了一定的安全检查,最大程度的保护企业资源。 - 服务鉴权
- Api返问范围检查,防止非公开Api被访问
- Auth2.0令牌解析
通过访问Auth对应的API解析用户信息,解析成功后将GlobalContext的Ueser对象赋值为此用户信息,通过ZeroNet中预定义的Context帧实现跨机器域传递,Api站点接收到会自动还原成GlobalContext。
GlobalContext通过RequestInfo属性传递请求的原始信息,包括:UserAgent、请求者IP及端口。
- 熔断与限流
- 请求数超过限值时返回503错误,从而保证ZeroNet不因为算力不足而瘫痪。
- 对于已知的不安全请求,直接拒绝访问,最大程度保护ZeroNet内部资源不受损失。
Http请求处理流程
#### HttpGateway的配置
route_config.json
{
/*系统设置*/
"sysConfig": {
/*是否开启ZeroNet网络*/
"FireZero": true,
/*是否开启返回值检查*/
"CheckResult": false,
/*是否开启API预检:即检查API是否存在、是否需要令牌、是否可公开访问*/
"CheckApiItem": false,
/*HTTP调用超时*/
"HttpTimeOut": 30000,
/*短信超时报警的时长(毫秒)*/
"WaringTime": 2000,
/*是否包含顶级目录*/
"IsAppFolder": false,
/*启用管理命令*/
"EnableInnerCommand": false,
/*启用内容页*/
"EnableContext": false,
/*内容页地址*/
"ContextAddr": ""
},
/*安全配置*/
"security": {
/*是否校验Auth*/
"fireBearer": true,
/*Auth站点及API名称*/
"authStation": "Authority",
"didApi": "v1/verify/did",
"atApi": "v1/verify/at",
/*黑洞地址*/
"blockAddress": "https://code.jquery.com/jquery-3.3.1.js",
/*拒绝使用的令牌,Key Value一样*/
"denyTokens": [],
/*
Http头拒绝的规则:其中DenyType枚举如下
None,// 不阻止
Hase,// 有此内容
NonHase,// 没有此内容
Count,// 达到数组数量
Equals,// 内容等于
Like,// 内容包含
Regex// 正则匹配
*/
"denyHttpHeaders": [
{
"Head": "X-Forwarded-For", /*Http头名称*/
"Value": "3", /*比对内容*/
"DenyType": "Count" /*比对类型*/
}
]
}
]
}