【API接口开放平台】第二期
前言
本笔记目的是梳理当天项目中学到的知识点,列出次日计划。如果有错误的地方,希望大家指出,感谢。
今日学习内容
1.API签名认证
2.客户端SDK开发(自己写一个starter)
1.API签名认证
每个用户都分配有一个公钥accessKey和一个私钥secretKey,用户使用私钥加签,服务端使用公钥验签。
签名的目的
1.身份验证:验证请求发送者的身份是否合法
2.防止篡改:防止请求参数在传输过程中被篡改。
3.防止重放攻击:防止攻击者截获通信数据包,向服务器重复发起相同的请求获取敏感数据。
加签实现(客户端)
请求参数body + secretKey密钥 + nonce随机数 + timestamp时间戳,再用摘要算法(如MD5、SHA1、SHA256)加密,生成签名sign。
Digester md5 = new Digester(DigestAlgorithm.SHA256);
String content = body + "." + secretKey;
return md5.digestHex(content);
注意:
- nonce和时间戳是用来防重放攻击的,nonce随机数通过Hutool工具类中的RandomUtil类实现。存在redis中,为节省资源,设置过期时间等于时间戳的有效时间。
- 摘要算法无法解密!!
用户在发送请求时,请求头中应带上以下5个字段:accessKey、body、nonce、timestamp、sign。(具体实现:先将字段放在Map中,再添加到请求头中)
验签实现(服务端)
服务端验签逻辑:
1.从请求头中取出5个字段(accessKey、body、nonce、timestamp、sign)
2.根据 accessKey 查询用户得到 secretKey
3.服务端用【客户端使用的摘要算法】生成签名
4.校验签名是否一致
5.校验时间戳是否过期(一般设计60s)
6.校验随机数是否存在
相关文章:
API签名认证(blog.csdn.net/incredible1…)
接口安全:谈谈加密与签名的区别(blog.csdn.net/boweiqiang/…)
2.客户端SDK开发(自己写一个starter)
目的就是简化开发,在本项目中就是将客户端需要的依赖,加签、加密等操作写在starter中,开发者引入这个starter之后,可以直接在application.yml中写配置,自动创建客户端。
新建项目
这个例子中项目名设置为api-client-sdk。
引入依赖
引入自己完成相应功能需要的依赖。
- spring-boot-configuration-processor 作用是生成配置文件中的代码提示
- lombok
- hutool 工具类 等等
删除部分代码(必须删!)
删除pom.xml中的这些代码,这些是maven构建项目的方式,我们现在是要构建依赖包,所以必须删掉这个。
删除启动类
我们不需要spring boot的启动类,将其删去
新建配置类
@Configuration:声明这个类是一个配置类
@ConfigurationProperties("yupi.client"):读取application.xml中的配置,设置到被注解类的属性中,括号里是给所有配置加的前缀。
@ComponentScan :配置包扫描定义的扫描路径,把符合扫描规则的类装配到spring容器。假如不配置扫描路径,那么 Spring 就会默认扫描当前类所在的包及其子包中的所有标注了 @Component,@Service,@Controller 等注解的类。
@Bean:在服务启动时,用于告诉方法,实例化一个Bean对象放到ioc容器中,然后这个Bean对象交给Spring管理,在需要初始化的实例,方法,内容时使用。
其中accessKey和secretKey就是在引入这个starter后配置文件中可配置的参数。
创建META_INF文件夹
在resource下创建META-INF文件夹,在META_INF新建spring.factories文件,复制配置类路径。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.yupi.apiclientsdk.ApiConfig
删除测试类
删除test类,或者maven install时跳过测试
测试效果
执行maven install命令,生成的依赖包在本地仓库中。
具体案例
1.在项目中引入这个依赖包
<dependency>
<groupId>com.yupi</groupId>
<artifactId>api-client-sdk</artifactId>
<version>0.0.1</version>
</dependency>
2.配置application.yml
yuapi:
client:
access-key: 6cb58edaebca37dfe7abd7c2df1b2f40
secret-key: 54c16a99690a8bdfdf443a69ecb0047d
3.在想使用的地方引入这个对象
@SpringBootTest
class ApiInterfaceApplicationTests {
// 看这一行
@Resource
private ApiClient apiClient;
@Test
void contextLoads() {
User user = new User();
user.setUsername("yupi");
String result = apiClient.getUsernameByPost(user);
System.out.println(result);
}
}
其它知识
Hutool工具类
这个工具类用途非常多!
1.非对称加密
使用非对称加密算法(如RSA算法)生成密钥对,非对称加密算法在加密和解密时使用两个不同的密钥。
举例:Hutool针对最常用的RSA算法构建了单独的对象:RSA
具体使用见官方文档:
2.HTTP客户端调用
利用hutool工具发送http请求。
// 举例
public String getNameByGet(String name) {
//可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("name", name);
String result = HttpUtil.get("http://localhost:8123/api/name/get/", paramMap);
System.out.println(result);
return result;
}
Maven命令区别
Maven 中package和install的区别在于: package只是将项目打包成jar或war文件,不会将其安装到本地仓库中。 install会将项目打包成jar或war文件,并将其安装到本地仓库中,以便其他项目可以引用它。
自动配置原理
1.Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类进行加载。
2.自动配置类是通过@ConfigurationProperties注解与application.xml中对应的属性进行绑定。