|
@@ -1,5 +1,6 @@
|
|
|
package space.anyi.openAPIGateway.filter;
|
|
package space.anyi.openAPIGateway.filter;
|
|
|
|
|
|
|
|
|
|
+import cn.hutool.crypto.digest.MD5;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
import org.reactivestreams.Publisher;
|
|
import org.reactivestreams.Publisher;
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
@@ -19,7 +20,9 @@ import reactor.core.CoreSubscriber;
|
|
|
import reactor.core.publisher.Mono;
|
|
import reactor.core.publisher.Mono;
|
|
|
import space.anyi.openAPI.comom.model.interfaceInfo.InterfaceInfo;
|
|
import space.anyi.openAPI.comom.model.interfaceInfo.InterfaceInfo;
|
|
|
import space.anyi.openAPI.comom.model.interfaceInfo.InterfaceStatus;
|
|
import space.anyi.openAPI.comom.model.interfaceInfo.InterfaceStatus;
|
|
|
|
|
+import space.anyi.openAPI.comom.model.user.User;
|
|
|
import space.anyi.openAPI.comom.service.inside.InsideInterfaceInfoService;
|
|
import space.anyi.openAPI.comom.service.inside.InsideInterfaceInfoService;
|
|
|
|
|
+import space.anyi.openAPI.comom.service.inside.InsideUserService;
|
|
|
|
|
|
|
|
import java.util.HashSet;
|
|
import java.util.HashSet;
|
|
|
import java.util.Objects;
|
|
import java.util.Objects;
|
|
@@ -43,6 +46,8 @@ public class ConsumerFilter implements GlobalFilter, Ordered {
|
|
|
private static final Logger log = LoggerFactory.getLogger(ConsumerFilter.class);
|
|
private static final Logger log = LoggerFactory.getLogger(ConsumerFilter.class);
|
|
|
@DubboReference
|
|
@DubboReference
|
|
|
private InsideInterfaceInfoService insideInterfaceInfoService;
|
|
private InsideInterfaceInfoService insideInterfaceInfoService;
|
|
|
|
|
+ @DubboReference
|
|
|
|
|
+ private InsideUserService insideUserService;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 记录时间戳和随机数nonce(防止重放攻击)
|
|
* 记录时间戳和随机数nonce(防止重放攻击)
|
|
@@ -92,7 +97,17 @@ public class ConsumerFilter implements GlobalFilter, Ordered {
|
|
|
response.setStatusCode(HttpStatus.NOT_FOUND);
|
|
response.setStatusCode(HttpStatus.NOT_FOUND);
|
|
|
return response.setComplete();
|
|
return response.setComplete();
|
|
|
}
|
|
}
|
|
|
- //todo:校验accessKey和secretKey
|
|
|
|
|
|
|
+ //校验accessKey和secretKey(sign)
|
|
|
|
|
+ User user = insideUserService.getUserByAccessKey(accessKey);
|
|
|
|
|
+ log.debug("user:{}", user);
|
|
|
|
|
+ if (Objects.isNull(user)) {
|
|
|
|
|
+ log.warn("user不存在:{}",user);
|
|
|
|
|
+ return parameterExceptionHandler(response,"accessKey不合法");
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!verifySign(sign,user.getSecretKey(), timestamp)) {
|
|
|
|
|
+ return parameterExceptionHandler(response,"sign不合法");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
//todo:是否还有调用次数
|
|
//todo:是否还有调用次数
|
|
|
|
|
|
|
|
return chain.filter(exchange).doOnSuccess(aVoid -> {
|
|
return chain.filter(exchange).doOnSuccess(aVoid -> {
|
|
@@ -101,6 +116,22 @@ public class ConsumerFilter implements GlobalFilter, Ordered {
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 校验摘要
|
|
|
|
|
+ * @param sign 摘要
|
|
|
|
|
+ * @param secretKey 密钥
|
|
|
|
|
+ * @param timestamp 时间戳
|
|
|
|
|
+ * @return boolean
|
|
|
|
|
+ * @description:
|
|
|
|
|
+ * @author: 杨逸
|
|
|
|
|
+ * @data:2025/11/27 11:43:54
|
|
|
|
|
+ * @since 1.0.0
|
|
|
|
|
+ */
|
|
|
|
|
+ private boolean verifySign(String sign,String secretKey,String timestamp) {
|
|
|
|
|
+ String hex16 = MD5.create().digestHex16(secretKey + timestamp + secretKey);
|
|
|
|
|
+ return sign.equals(hex16);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private Mono<Void> parameterExceptionHandler(ServerHttpResponse response, String msg) {
|
|
private Mono<Void> parameterExceptionHandler(ServerHttpResponse response, String msg) {
|
|
|
response.writeAndFlushWith(new Mono<Publisher<? extends DataBuffer>>() {
|
|
response.writeAndFlushWith(new Mono<Publisher<? extends DataBuffer>>() {
|
|
|
@Override
|
|
@Override
|