基于 OpenResty 的接口网关设计( 四 )

  •  
  • D. URL 规范
  • 内网服务遵循的 URL 格式为 http://<host>:<port>/<context>/path/to/your/api,应用上下文根紧跟在 <host>:<port> 之后,以便统一获取来找到配置 。比如:http://172.0.8.177:8080/user/users/{uid}/info,其中 user 为应用上下文根,紧跟在 172.0.8.177:8080 之后 。
  • E. 样例
  • 内网用户信息服务由原来的 API:/user/users/{uid}/info 提供,后来迁移至 API:/user/users/{uid}/user-info,当第三方 CampA (IP 为 172.0.1.172) 发起 GET 请求时,请求 URL 为 http://openapi.company.com/user/users/27/info?thirdparty=CampA&cp=fj375x...sign=abxuos8nb... 。
  1. 初始化常量和依赖等
  2. 通过 CampA 与 user Context 获取第三方配置
  3. HAProxy Internet 接收请求发到 OpenApi 接口网关,OpenApi 把 /user/users/27/info URI 重写为 /user/users/27/user-info/
  4. 校验第三方请求 IP,在 IP 白名单中,校验通过;校验 URI /user/users/27/user-info 在授权的 URI 中,校验通过
  5. 调用安全服务对请求进行解密与验签,解密成功,验签通过,获取明文
  6. 将拥有明文的请求转发到开放接口服务
  7. 获取响应,调用安全服务对响应报文进行签名与加密,返回给第三方 CampA 。
  • 3.2.2.2 配置服务设计

基于 OpenResty 的接口网关设计

文章插图
 
  •  
  • A. 数据库表设计
  • openapi_thirdparty_config

基于 OpenResty 的接口网关设计

文章插图
 
  •  
  • openapi_api_config

基于 OpenResty 的接口网关设计

文章插图
 
  •  
  • openapi_api_mapping

基于 OpenResty 的接口网关设计

文章插图
 
  •  
  • B. 配置服务接口响应
{ # 接口映射配置 "apiMapping":{ "$context":{ "$fromApi":"$toApi" } }, # 接口白名单配置、加解密配置 "apiConfig":{ "$channel $context":{ "$httpMethod $uri":{ "reqNeedDecrypt":false, "respNeedEncrypt":false } } }, # IP 白名单配置,验签名配置 "channelConfig":{ "$channel":{ ips:{ "$ip":1 }, "reqNeedVerifySign":false, "respNeedSign":false, "needCheckIp":false } }}
  • 3.2.2.3 安全服务设计
  • 为了保证请求或响应的完整性、以及请求或响应来源的合法性,双方传输需要进行签名;另外,由于可能开放接口的请求或响应会包含敏感信息,需要进行加密传输 。这里的安全服务就是指请求的解密与验签和响应的签名与加密服务 。

基于 OpenResty 的接口网关设计

文章插图
 
  •  
  • A. 算法约定
  • 对称加密算法:3DES(DESede/ECB/PKCS5Padding)
  • 非对称加密算法:RSA(RSA/ECB/PKCS1Padding)
  • 签名算法:SHA1WithRSA
  • B. 公钥约定
  • 双方预先交换 RSA 公钥
  • 双方公钥编码方式:UTF-8 编码的 Base64String
  • 双方进行加解密与验签名可使用同一把 RSA 公私钥或者分别使用各自的公私钥,双方约定即可
  • C. 第三方请求流程示意

基于 OpenResty 的接口网关设计

文章插图
 
  •  
  • 其中,添加统一参数为必选步骤,请求签名、请求加密、响应解密、以及响应验签都是可选步骤 。
  • 无论是 GET、POST 或者其他方式的请求,第三方在访问平台开放接口前,都需要添加统一参数到 request parameter 中
  • 统一参数包括第三方应用名、请求时间戳、随机不重复字符串 nonce 等
  • 验签名属于应用维度 —— 针对应用做验签名(比如:按照约定需要对第三方应用 A 进行验签,则应用 A 访问数禾任何接口都需要签名)
  • 加解密属于接口维度 —— 针对接口做加解密(比如:同一个第三方访问 A 接口需要加密,而访问 B 接口可以不需加密)
  • D. 加解密示意(以第三方请求为例)

基于 OpenResty 的接口网关设计

文章插图
 
  •  
  • E. 验签名示意(以第三方请求为例)

基于 OpenResty 的接口网关设计

文章插图