当前位置:网站首页 > 技术博客 > 正文

统一登录器网关未开放



本文主要讲解开放接口设计,主要是以SpringBoot web 项目,基于自定义注解+反射+非对称加密RSA签名等实现的灵活的统一开放接口设计,文末附源码地址。

互联网公司随着业务的发展,系统间或多或少会开放一些对外接口,这些接口都会以API的形式提供给外部。
为了方便统一管理,统一鉴权,统一签名认证机制,流量预警等引入了统一网关。API网关是一是对外接口唯一入口。
在这里插入图片描述

除了业务功能还需要有

  • 统一鉴权
  • 流量监控
  • 路由分发
  • 架构简单易懂,方便维护
  • 方便追加功能,不需要重复写鉴权等逻辑代码

对外开放的接口,数据安全性是第一位

  • 如何保证安全通信,防止数据被恶意篡改等攻击呢?
  • 怎么证明是你发的请 求呢?

比较流行的方式一般是

  • 加密 -> 密文传输,接收方需要解密
  • 加签 -> 双方建立秘钥-请求方加签,接收方验签防止数据中途被篡改

# 3.开放接口设计 本文用到的主要技术点

  • 反射机制
  • RSA签名算法
  • SpringBoot
  • Hibernate-validator注解式参数校验

公共参数

参数 类型 是否必填 最大长度 描述app_idString是32业务方appIdmethodString是200请求方法versionString是10默认:1.0api_request_idString是32随机请求标识,用于区分每一次请求charsetString是16默认:UTF-8sign_typeString是10签名类型:RSA或RSA2signString是-签名contentString是-业务内容 :json 格式字符串


返回内容

参数 类型 是否必填 最大长度 描述successboolean是16是否成功dataObject是-返回业务信息(具体见业务接口)error_codeString是10错误码(success为false时必填)error_msgString是128错误信息码(success为false时必填)

这里是使用的是RSA签名
规则如下:

  • 签名参数剔除sign_type 、 sign ;
  • 将剩余参数第一个字符按照ASCII码排序(字母升序排序),遇到相同字母则按第二个字符ASCII码排序,以此类推;
  • 将排序后的参数按照组合“参数=参数值”的格式拼接,并用&字符连接起来,生成的字符串为待签名字符串;
  • 使用RSA算法通过私钥生成签名

RSA === SHA1 --> base64
RSA2 === SHA256 --> base64

注:源码见文章末,依赖这里只简单列出了父pom中部分依赖,,详见源码
工程结构图:在这里插入图片描述

3.3.1Maven依赖

 
 

3.3.2配置文件

 

3.3.3自定义注解

 


开放接口实现类注解

 

3.3.4API接口初始化容器与扫描器

 
 
 

3.3.5API请求处理客户端

作用说明:统一网关controller中调用一下方法进行验签与执行相应的业务方法。

 

3.3.6启动类

 

3.3.7统一异常处理

 

3.3.8统一网关controller

 

3.3.9测试实战DEMO

入参BO

 

测试service接口
注意:注解@OpenApi 使用 ,method就是入参中的方法

 

测试接口实现类

 

3.4.1不验签连通性测试

注:为了方便调试先将配置文件中的验签开关修改为 false

 

正常访问
在这里插入图片描述
异常情况
在这里插入图片描述
在这里插入图片描述

3.4.2验签测试

将配置文件验签开关开启

 

由于签名是根据私钥+动态的参数根据规则生成的,在PostMan上测试还得先生成签名,在源码文件中有一个测试Demo如下在这里插入图片描述
带签名正常访问
在这里插入图片描述
签名异常情况下访问在这里插入图片描述

  • 通过以上方式实现的统一网关,在后续添加业务的时候,只需要添加对应的service,并加好相应注解即可。
  • 目前配置的参数入参默认是下划线方式,如果业务中要用驼峰,可以改以下方法。
    • com.open.api.config.gateway.ApiClient#invoke
    • 目前配置的是,默认下划线方式,参考了大厂的开放接口,大部分都是下划线方式的参数
      在这里插入图片描述
  • 需要自定义业务接口请参考 3.3.9测试实战DEMO。

因为使用反射方式调用方法,所以自定义接口的时候也需要遵循规范,参数为2个
参数1 String requestId,
参数2 业务类型对象参数,实际是 网关入口,content 内容JSON转换后的对象参数。在这里插入图片描述

源码地址:传送门

关注程序员小强公众号更多编程趣事,知识心得与您分享
在这里插入图片描述

  • 上一篇: uint8_t char
  • 下一篇: 二阶低通滤波器电路
  • 版权声明


    相关文章:

  • uint8_t char2024-11-19 19:30:00
  • java虚拟机栈是线程隔离的吗2024-11-19 19:30:00
  • c中malloc函数的用法2024-11-19 19:30:00
  • ir2104驱动电路原理2024-11-19 19:30:00
  • wd硬盘是固态的吗2024-11-19 19:30:00
  • 二阶低通滤波器电路2024-11-19 19:30:00
  • jdk8 hashmap的改进2024-11-19 19:30:00
  • 类的静态成员变量怎么赋值2024-11-19 19:30:00
  • bind9配置详解2024-11-19 19:30:00
  • vue启动后浏览器访问不了2024-11-19 19:30:00