Pārlūkot izejas kodu

feat:后端项目,在网关模块中使用根据accessKey查询用户信息内部接口;并在网关进行sign校验;

yang yi 9 mēneši atpakaļ
vecāks
revīzija
a3b47bfd09

+ 32 - 1
open-api-gateway/src/main/java/space/anyi/openAPIGateway/filter/ConsumerFilter.java

@@ -1,5 +1,6 @@
 package space.anyi.openAPIGateway.filter;
 
+import cn.hutool.crypto.digest.MD5;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.reactivestreams.Publisher;
 import org.slf4j.Logger;
@@ -19,7 +20,9 @@ import reactor.core.CoreSubscriber;
 import reactor.core.publisher.Mono;
 import space.anyi.openAPI.comom.model.interfaceInfo.InterfaceInfo;
 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.InsideUserService;
 
 import java.util.HashSet;
 import java.util.Objects;
@@ -43,6 +46,8 @@ public class ConsumerFilter implements GlobalFilter, Ordered {
     private static final Logger log = LoggerFactory.getLogger(ConsumerFilter.class);
     @DubboReference
     private InsideInterfaceInfoService insideInterfaceInfoService;
+    @DubboReference
+    private InsideUserService insideUserService;
 
     /**
      * 记录时间戳和随机数nonce(防止重放攻击)
@@ -92,7 +97,17 @@ public class ConsumerFilter implements GlobalFilter, Ordered {
             response.setStatusCode(HttpStatus.NOT_FOUND);
             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:是否还有调用次数
 
         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) {
         response.writeAndFlushWith(new Mono<Publisher<? extends DataBuffer>>() {
             @Override