/openapi-auth-spring-boot-starter

用于开放式接口的请求认证和数据加密解密

Primary LanguageJavaApache License 2.0Apache-2.0

openapi-auth-spring-boot-starter

用于开放式接口的请求认证和数据加密解密

GitHub release (latest by date) GitHub

简介

在项目开发中,有时候会给第三方提供的接口,由于是开放式接口,容易被他人恶意调用,甚至泄露数据。此项目的功能是加密和认证参数。

本项目提供三种功能

  • 请求认证: 该功能默认开启, 在服务端配置用户请求唯一key和密钥后,用户调用接口时需要通过唯一key、密钥、时间戳、随机字符串和请求参数拼接后进行摘要运算生成签名
  • 请求参数解密: 该功能默认关闭, 开启后用户请求时需要对请求参数进行加密
  • 响应加密数据: 该功能默认关闭, 开启后用户收到响应时需要进行解密

重要: 所有功能只对使用@RequestBody方式接收参数的接口生效

安装

引入Maven依赖

<dependency>
  <groupId>com.zhangaochong</groupId>
  <artifactId>openapi-auth-spring-boot-starter</artifactId>
  <version>1.0.0</version>
</dependency>

快速使用

  1. SpringBoot启动类加@EnableOpenApiAuth注解
  2. 配置文件添加配置
openapi-auth:
  users:
    secret-key-map:
      用户唯一key: 用户密钥
      ...
  1. 在需要用到的Controller类或方法上加@OpenApiAuth注解
  2. 此时该接口已具备请求认证功能,用户请求时需生成签名

接口请求

参数说明

参数名 说明
accessKey 分配给用户的唯一key
secretKey 用户的唯一key对应的密钥
timestamp 当前时间毫秒级时间戳
nonce 随机字符串,每次请求不重复
sign 签名,签名生成方式见后文

签名生成规则

  1. 将accessKey,secretKey,timestamp,nonce,sign及业务参数按参数名ascii码顺序排序
  2. 排序后按key1=value1&key2=value2...拼接字符串
  3. 将拼接后字符串进行MD5运算生成签名

请求示例

使用POST json方式

原有业务参数,如
{
	"name: "zhangsan",
	"age: 20
}

生成签名
sign = md5(accessKey=test&age=20&name=zhangsan&nonce=abcdefg&secretKey=test&timestamp=1589877113000)

加入认证参数
{
	"name: "zhangsan",
	"age: 20,
	"accessKey": "test"
	"timestamp": 1589877113000
	"nonce": "abcdefg"
	"sign": "62c0f590c756089adf3632d18a55e7b6"
}

自定义功能

自定义用户源

默认通过配置文件配置用户唯一key及密钥,可以通过自定义功能从数据库获取。

  1. 创建类继承AbstractAuthHandler, 实现getUserSecretKey, saveUserNonce, getUserLastNonce方法
  2. 配置该类对象为AuthHandler的Bean
@Bean
public AuthHandler authHandler() {
    return new XxxAuthHandler();
}

开启请求参数解密

默认请求参数解密关闭,通过修改配置文件开启

  1. 修改配置文件
openapi-auth:
  request-decrypt: enable
  1. 默认只进行Base64解码,通过实现DecryptHandler类的decrypt方法配置自定义解密方法
  2. 配置该类对象为DecryptHandler的Bean
@Bean
public DecryptHandler decryptHandler() {
    return is -> {
        return 解密方法(is);
    };
}

开启响应数据加密

默认响应数据加密关闭,通过修改配置文件开启

  1. 修改配置文件
openapi-auth:
  response-encrypt: enable
  1. 默认只进行Base64编码,通过实现EncryptHandler类的encrypt方法配置自定义加密方法
  2. 配置该类对象为EncryptHandler的Bean
@Bean
public EncryptHandler encryptHandler() {
    return o -> {
        return 解密方法(o);
    };
}