随着业务发展,系统索要对接的第三方会越来越多,那么如何让第三方快速安全的接入,就会成为各业务系统面临的问题。设计一个具备鉴权、限流、熔断等功能的API网关就显得至关重要,本文的文章目录如下。
API网关作用
在之前的文章中提到,API网关的作用,它相当于在业务系统中充当了一个屏障,或者说是门面的作用。对于系统的安全性等都非常重要。
总体设计
鉴权、验签等功能是通过责任链的方式进行处理,网关会根据配置进行路由,具体处理流程为:
1.基础网关的设计
网关会根据配置中的路由规则将请求进行转发。如将 /order/* 的请求转发给内部的订单系统、/user/* 的请求转发给内部的用户系统, 这种做法常用于对整个业务系统负责的基础网关.
2.服务第三方的开放API网关设计
该种网关会讲请求资源作为参数当道请求体中。主要出于以下原因:
- 开放API服务于第三方, 屏蔽内部路径, 有利于提供命名统一且规范的接口.
- 请求接口的映射由网关的路由表维护, 内部接口升级甚至切换到新服务对外接口不变.
- 能够更细粒度地针对接口进行权限控制、限流、统计等.
公共请求参数
● app_id: 应用ID, 应用ID是授权的主体, 是调用方的身份标识
● method: 请求方法, 与内部URL对应, 由网关的路由表维护.
● timestamp和nonce用来防重放攻击.
● biz_content: 业务参数, 这个参数将转发给内部业务系统.
公共返回参数
● biz_content: 返回业务参数, 网关转发业务系统的返回值.
签名方案
调用方和服务方均生成2048位RSA秘钥, 交换公钥. 私钥用于签名, 公钥用于验签, 开放API网关对外接口使用https, 故暂不需额外做加密处理.
签名算法:
数据库方案
数据库存储秘钥权限等相关的配置,E-R图如下:
● app: 调用方主体, 用于标识请求方身份.
● group: 组, app分组, 可通过group统一进行授权.
● subject: 主体(app/group).
● resource: 资源, 维护请求资源与内部接口的映射关系, url+http_method 对应唯一的resource_id.
开放API相关的系列文章可以参考掘金文章:
开放API网关实践(一) ——设计一个API网关
开放API网关实践(二) —— 重放攻击及防御
开放API网关实践(三) —— 限流