API开放平台后端
dto: Data Transfer Object, 可以理解为请求参数对象
VO: Value Object, 可以理解为相应参数对象
运行项目后,访问/doc.html
project | package | version | remark |
---|---|---|---|
backend,interface | java SDK | 17 | |
backend,interface | springboot | 3.3.5 | web框架 |
backend | mybatis-plus | 3.5.9 | 操作数据库 |
backend | fastjson2 | 2.0.53 | JSON操作 |
backend | knife4j | 4.4.0 | open api文档 |
backend | JJwt | 0.12.5 | Jwt |
interface | Hutool | 5.8.16 | 工具包(封装http请求)https://www.hutool.cn/docs/#/ |
gateway | spring cloud gateway | 3.3.6 | API网关 |
- 全局异常处理器(AOP)
- 全局请求拦截器(Interceptor)
- 自定义状态码
- 封装通用响应类
- Swagger + knife4j接口文档
- 多环境配置
- 用户鉴权
- 分页排序
- 用户创建
- 角色创建,授权,删除,查询
- API签名认证(亮点)
- open api sdk(springboot starter)
- 网关
- RPC
本质:
- 签发方签名
- 使用方签名(校验签名)
作用:
- 保证安全性,不能随便一个人都能使用
通过http request Header传递
-
参数 1: accessKey: 调用的标识,(复杂、无序、无规律)
-
参数 2: secretKey: 密钥(复杂、无序、无规律)
(类似用户名和密码, 区别: ak、sk是无状态的)
注意点:
- 密钥不能直接在服务器之间传递,有可能会被拦截
参数 3: 用户参数
参数 4:sign签名
加密方式: 对称加密,非对称加密,md5加密(不可解密)
用户参数 + 密钥 -> 签名生成算法 -> 不可解密的值
abc + abcdefgh -> xcasdsadfh1i2301hsiaodnsa-
服务端如何校验?
服务端用一样的参数和 签名算法去生成签名,校验签名是否一致。
如何防重放?
重放就是同一个签名调用多次
措施:
-
参数5: 加随机数, 只能用一次
服务端要保存用过的随机数
-
参数6: 加timestamp时间戳
-
方法1和方法2搭配使用,在时间戳的许可时间内,记录使用过的随机数。当超过许可时间,清除记录过的随机数。
完整思路:
Controller方:
-
用户创建时,会自动生成一个secret ID(√)
-
用户点击创建secret Key的时候,会创建一个secret Key, 但创建后需要用户自己保存,之后用户无法查看创建过的secret key,只能重新创建一个(√)
Client方:
- 将accessKey,用户参数,随机数,时间戳添加到Header中(√)
- 使用 用户参数和secret key生成一个sign,并添加到Header中(√)
- 将header添加到http请求中调用API(√)
API Service方:
验证签名是否合法:
- 查询数据库中是否有accessKey且可用状态,则pass(√)
- 查询数据库,用accessKey查询secretKey, 用secretKey和用户参数生成一个sign, 比对这个sign和client传来的sign是否一致, 一致则pass(√)
- 查看nonce是否存在于redis中,如果存在,则是接口重放,不存在则pass(√)
- 查看时间戳是否在允许范围内(假设5分钟内),如果时间戳超出范围,则服务器拒绝该请求。
- 服务器对IP的请求频率进行监控,请求频率过高的,直接禁止。
编写一个springboot starter SDK,开发者引入后可以直接在application.yaml中写配置,自动创建客户端
如何构建一个starter
-
引入lombok和processor(自动生成application引入提示)
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>
-
去除maven中的build标签, starter项目不需要构建
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build>
-
写一个config类
@Configuration @ConfigurationProperties("forty.client") @Data @ComponentScan public class FortyClientConfig { private String secretId; private String secretKey; @Bean public FortyClient fortyClient() { return new FortyClient(secretId, secretKey); } }
-
在resources文件夹中创建
META-INF/spring.factories
,将配置类的路径写入到配置中org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.forty.sdk.FortyClientConfig