开源软件名称:api-wrap
开源软件地址:https://gitee.com/slacrey/api-wrap
开源软件介绍:
服务端安全签名验签chang list引入jar包gradlecompile 'com.seelyn:api-wrap-boot:{version}' maven<dependency> <groupId>com.seelyn</groupId> <artifactId>api-wrap-boot</artifactId> <version>{version}</version></dependency> 使用示例- 使用EnableApiWrap注解,开启API Wrap功能
@SpringBootApplication@EnableApiWrappublic class WrapWebApplication { public static void main(String[] args) { SpringApplication.run(WrapWebApplication.class, args); }} - 在controller类方法或类上添加@ApiWrap注解, 注解也可以自定义处理类,只有使用了注解的类和方法才能接收签名验签请求
@ApiWrap@PostMapping(value = "/web")public WrapRequest<DefaultWrapData> web(@RequestBody WrapRequest<DefaultWrapData> request) { return request;} @ApiWrap(value=CustomWrapHandler.class)CustomWrapHandler类需要实现WrapHandler接口 - WrapRequest 是统一的API验证请求类,其中泛型 DefaultWrapData类需要继承WrapData类
public class WrapRequest<T extends WrapData> { private String appKey; private String signature; private long timestamp; private int nonce; private T data; //setter getter省略.... } import com.seelyn.apiwrap.WrapData;import com.seelyn.apiwrap.annotation.SignIgnore;public class DefaultWrapData extends WrapData { // SignIgnore 注解标识标识忽略属性用于签名 @SignIgnore private String name; private String url; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; }} @Autowareprivate WrapStore wrapStore;// 存储密钥wrapStore.putSecret(appKey, appSecret); #===========api wrap===========# app密钥,若用户没有自定义,则使用此api.wrap.secret=testjjhdsa# 单位秒,请求时间和服务器时间不能超过300秒api.wrap.legal-time=300# 若没有redis配置,wrapStore为本地存储# 若配置了redis,则wrapStore为redis存储#===========api wrap redis=============spring.redis.host=localhostspring.redis.port=6379spring.redis.database=0 - 若没有redis配置,wrapStore为本地存储
- 若配置了redis,则wrapStore为redis存储
客户端辅助签名工具引入工具包gradlecompile 'com.seelyn:api-wrap-client:{version}' maven<dependency> <groupId>com.seelyn</groupId> <artifactId>api-wrap-client</artifactId> <version>{version}</version></dependency> 使用说明DefaultWrapData WrapData = new DefaultWrapData(); WrapClient wrapClient = WrapClient.create(appKey, appSecret);WrapRequest<DefaultWrapData> request = wrapClient.wrap(WrapData)// request 为带签名信息的对象 服务端扩展扩展WrapStore@Serviceclass CustomWrapStore extends RedisWrapStore { } 这样继承RedisWrapStore类或者实现WrapStore接口,可自定义包裹存储接口。系统自动使用你自定义的WrapStore 扩展WrapHandler自定义CustomWrapHandler// 自定义WrapHandler, 使用@Component注入到spring中管理@Componentpublic class CustomWrapHandler implements WrapHandler { @Override public String getAppSecret(String appKey) { return null; } @Override public String getSignature(String appKey, WrapRequest<WrapData> request) { return null; } @Override public void isLegalTime(long timestamp) { } @Override public void isReplayAttack(String appKey, long timestamp, int nonce, String signature) { }} 使用CustomWrapHandler// ApiWrap中指定CustomWrapHandler.class类,则系统会根据此类型从Spring中获取对应的实例 @ApiWrap(value = CustomWrapHandler.class) @PostMapping(value = "/web") public WrapRequest<DefaultWrapData> custom(@RequestBody WrapRequest<DefaultWrapData> request) { return request; } |
请发表评论