【API接口开放平台】第二期

126 阅读5分钟

【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。

image.png

引入依赖

引入自己完成相应功能需要的依赖。

  1. spring-boot-configuration-processor 作用是生成配置文件中的代码提示
  2. lombok
  3. hutool 工具类 等等

删除部分代码(必须删!)

删除pom.xml中的这些代码,这些是maven构建项目的方式,我们现在是要构建依赖包,所以必须删掉这个。

image.png

删除启动类

我们不需要spring boot的启动类,将其删去

新建配置类

@Configuration:声明这个类是一个配置类

@ConfigurationProperties("yupi.client"):读取application.xml中的配置,设置到被注解类的属性中,括号里是给所有配置加的前缀。

@ComponentScan :配置包扫描定义的扫描路径,把符合扫描规则的类装配到spring容器。假如不配置扫描路径,那么 Spring 就会默认扫描当前类所在的包及其子包中的所有标注了 @Component,@Service,@Controller 等注解的类。

@Bean:在服务启动时,用于告诉方法,实例化一个Bean对象放到ioc容器中,然后这个Bean对象交给Spring管理,在需要初始化的实例,方法,内容时使用。

其中accessKey和secretKey就是在引入这个starter后配置文件中可配置的参数。

image.png

创建META_INF文件夹

resource下创建META-INF文件夹,在META_INF新建spring.factories文件,复制配置类路径。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.yupi.apiclientsdk.ApiConfig  

删除测试类

删除test类,或者maven install时跳过测试

测试效果

执行maven install命令,生成的依赖包在本地仓库中。

image.png

具体案例

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

具体使用见官方文档:

doc.hutool.cn/pages/Asymm…

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中对应的属性进行绑定。