From 72adfb2479db13afa7f79511f67a003dd01ffb45 Mon Sep 17 00:00:00 2001 From: zhaochengke Date: Tue, 18 Jul 2023 14:51:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=93=8D=E5=BA=94=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++ .../nsgk/agentcentersdk/api/NSApiResult.java | 17 ++++++++- .../com/nsgk/agentcentersdk/api/NSSDK.java | 10 +++++ .../nsgk/agentcentersdk/api/NSSDKClient.java | 30 ++++++++++++++- .../nsgk/agentcentersdk/api/NSSDKServer.java | 31 ++++++++++++---- .../nsgk/agentcentersdk/utility/NSCrypto.java | 37 ++++++++++++++++++- .../agentcenter/AgentCenterController.java | 17 ++++----- .../com/ruoyi/agentcenter/object/Result.java | 6 +++ .../agentcenter/service/IAgentCenter.java | 3 +- .../service/impl/AgentCenterImpl.java | 15 ++------ 10 files changed, 141 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index f936503..3e50b21 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,16 @@ > 客户端手动导入: ```mvn install:install-file -Dfile=agentcenter-sdk-1.0.0nsgk1.jar -DgroupId=com.nsgk -DartifactId=agentcenter-sdk -Dversion=1.0.0nsgk1 -Dpackaging=jar``` +> 客户端依赖: +``` + + + com.nsgk + agentcenter-sdk + 1.0.0nsgk1 + +``` + --- #### 兼容性 当版本不一致时 diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java index 919dfd0..1748f53 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java @@ -37,6 +37,21 @@ public final class NSApiResult this.errno = errno; } + NSApiResult(boolean suc, String msg, Object data) + { + this(suc, msg, data, NSErrno.ERRNO_OK); + } + + NSApiResult(boolean suc, String msg, Object data, int errno) + { + this(suc, msg, data, System.currentTimeMillis(), errno); + } + + NSApiResult(boolean suc, String msg, Object data, Long timestamp, int errno) + { + this(suc ? NS_RESULT_SUCCESS : NS_RESULT_ERROR, msg, data, timestamp, errno); + } + static NSApiResult Success(String msg, Object data) { return new NSApiResult(NS_RESULT_SUCCESS, msg, data); @@ -56,7 +71,7 @@ public final class NSApiResult jsonObject.getInteger("code"), jsonObject.getString("msg"), jsonObject.containsKey("data") ? jsonObject.get("data") : null, - jsonObject.containsKey("data") ? jsonObject.getLong("timestamp") : null, + jsonObject.containsKey("timestamp") ? jsonObject.getLong("timestamp") : null, jsonObject.containsKey("errno") ? jsonObject.getInteger("errno") : null ); } diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDK.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDK.java index 7f7589c..72069ac 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDK.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDK.java @@ -58,6 +58,16 @@ public final class NSSDK return _identifier.get(); } + public static String PrivateKey() + { + return _privateKey.get(); + } + + public static String PublicKey() + { + return _publicKey.get(); + } + public static NSSDKClient InstanceClient() { if(!NSConv.FALSE(_clientInit.get())) diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java index 1461963..4b5b714 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java @@ -1,6 +1,8 @@ package com.nsgk.agentcentersdk.api; import cn.hutool.core.util.URLUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import com.nsgk.agentcentersdk.core.NSConstants; import com.nsgk.agentcentersdk.core.NSProtocol; import com.nsgk.agentcentersdk.core.NSReportObject; @@ -67,7 +69,7 @@ public final class NSSDKClient NSNetworkResponse response = NSNetworkManager.Post(request); NSErrGlobal.ASSERT(response.IsSuccess(), NSErrno.ERRNO_SYS_HTTP); String json = response.getData(); - return NSApiResult.FromJSON(json); + return FromJSON(json); } private String BuildUrl(String url) @@ -87,7 +89,7 @@ public final class NSSDKClient dataStr = object.getDataStr(); try { - dataStr = NSCrypto.RSAEncrypt(dataStr, publicKey); + dataStr = NSCrypto.RSAEncrypt_publicKey(dataStr, publicKey); NSAssert.NotEmpty(dataStr, NSErrno.ERRNO_SYS_ENCRYPT_FAIL); } catch(Exception e) @@ -98,4 +100,28 @@ public final class NSSDKClient } request.setData(dataStr); } + + NSApiResult FromJSON(String str) + { + JSONObject jsonObject; + + jsonObject = JSON.parseObject(str); + return new NSApiResult( + jsonObject.getInteger("code"), + jsonObject.getString("msg"), + UnwrapClientResponseData(jsonObject.get("data")), + jsonObject.containsKey("timestamp") ? jsonObject.getLong("timestamp") : null, + jsonObject.containsKey("errno") ? jsonObject.getInteger("errno") : NSErrno.ERRNO_OK + ); + } + + private Object UnwrapClientResponseData(Object data) + { + if(null != data) + { + if(data instanceof String) + data = NSCrypto.RSADecrypt_publicKey((String)data, publicKey); + } + return data; + } } diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java index 2d2e600..0771754 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java @@ -1,5 +1,6 @@ package com.nsgk.agentcentersdk.api; +import com.alibaba.fastjson2.JSON; import com.nsgk.agentcentersdk.core.NSConstants; import com.nsgk.agentcentersdk.core.NSProtocol; import com.nsgk.agentcentersdk.core.NSReportObject; @@ -11,7 +12,6 @@ import com.nsgk.agentcentersdk.utility.NSArr; import com.nsgk.agentcentersdk.utility.NSCrypto; import com.nsgk.agentcentersdk.utility.NSHttp; -import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; // SDK服务端 @@ -55,7 +55,7 @@ public final class NSSDKServer ; try { - data = NSCrypto.RSADecrypt(data, privateKey); + data = NSCrypto.RSADecrypt_privateKey(data, privateKey); NSAssert.NotEmpty(data, NSErrno.ERRNO_SYS_DECRYPT_FAIL); res.SetDataStr(data, clazz); NSErrGlobal.ASSERT(res.getData().Normalized() == 0, NSErrno.ERRNO_SYS_INVALID_FIELD); @@ -83,19 +83,34 @@ public final class NSSDKServer } // 响应客户端 - public static NSApiResult Resp(int code, String msg, Object...data) + public NSApiResult Resp(boolean success, String msg, Object...data) { - return new NSApiResult(code, msg, NSArr.DefParm(data)); + return new NSApiResult(success, msg, WrapClientResponseData(data)); } - public static NSApiResult Success(String msg, Object...data) + public NSApiResult Resp(int errno, String msg, Object...data) { - return NSApiResult.Success(msg, NSArr.DefParm(data)); + return new NSApiResult(errno == NSErrno.ERRNO_OK, msg, WrapClientResponseData(data), errno); } - public static NSApiResult Fail(int errno, String msg, Object...data) + public NSApiResult Success(String msg, Object...data) { - return NSApiResult.Error(errno, msg, NSArr.DefParm(data)); + return NSApiResult.Success(msg, WrapClientResponseData(data)); } + public NSApiResult Fail(int errno, String msg, Object...data) + { + return NSApiResult.Error(errno, msg, WrapClientResponseData(data)); + } + + private Object WrapClientResponseData(Object...data) + { + Object o = NSArr.DefParm(data); + if(null != o) + { + if(!(o instanceof String)) + o = NSCrypto.RSAEncrypt_privateKey(JSON.toJSONString(o), privateKey); + } + return o; + } } diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSCrypto.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSCrypto.java index ba63146..ec5be1f 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSCrypto.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSCrypto.java @@ -9,10 +9,21 @@ import cn.hutool.crypto.asymmetric.RSA; import java.nio.charset.StandardCharsets; // 加密工具 +// 加密数据返回都为base64, 解密数据传参都为base64 +// 客户端存放公钥, 服务端存放私钥 +/* + / ---------> \ + 公钥加密 \ / -> 私钥解密 + / \ / \ +客户端 服务端 处理/返回响应 + \ / \ / + 公钥解密 / \ <- 私钥加密 + \ <--------- / + */ public final class NSCrypto { // RSA公钥加密(客户端) raw -> base64 - public static String RSAEncrypt(String rawData, String publicKey_base64) + public static String RSAEncrypt_publicKey(String rawData, String publicKey_base64) { RSA rsa; @@ -23,7 +34,7 @@ public final class NSCrypto } // RSA私钥解密(服务端) base64 -> raw - public static String RSADecrypt(String encryptBase64Data, String privateKey_base64) + public static String RSADecrypt_privateKey(String encryptBase64Data, String privateKey_base64) { RSA rsa; @@ -33,5 +44,27 @@ public final class NSCrypto return StrUtil.str(rsa.decrypt(Base64.decode(encryptBase64Data), KeyType.PrivateKey), StandardCharsets.UTF_8); } + // RSA私钥加密(服务端) raw -> base64 + public static String RSAEncrypt_privateKey(String rawData, String privateKey_base64) + { + RSA rsa; + + if(NSStr.IsEmpty(rawData) || NSStr.IsEmpty(privateKey_base64)) + return ""; + rsa = SecureUtil.rsa(privateKey_base64, null); + return rsa.encryptBase64(rawData, KeyType.PrivateKey); + } + + // RSA公钥解密(客户端) base64 -> raw + public static String RSADecrypt_publicKey(String encryptBase64Data, String publicKey_base64) + { + RSA rsa; + + if(NSStr.IsEmpty(encryptBase64Data) || NSStr.IsEmpty(publicKey_base64)) + return ""; + rsa = SecureUtil.rsa(null, publicKey_base64); + return StrUtil.str(rsa.decrypt(Base64.decode(encryptBase64Data), KeyType.PublicKey), StandardCharsets.UTF_8); + } + private NSCrypto() {} } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java index 1453d80..aae0d08 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java @@ -53,23 +53,22 @@ public class AgentCenterController extends BaseController @PostMapping("/report") public NSApiResult report(HttpServletRequest request) { + NSSDKServer server; + + NSSDK.InitServer(RuoYiConfig.Secret.privateKey); + server = NSSDK.InstanceServer(); try { - Result result = agentCenter.postHandle(request); - return response(result); + Result result = agentCenter.postHandle(server, request); + return server.Resp(result.getCode(), result.getMessage(), result.getData()); } catch(NSException e) { - return NSSDKServer.Fail(e.getErrno(), e.getMessage()); + return server.Fail(e.getErrno(), e.getMessage()); } catch(Exception e) { - return NSSDKServer.Fail(NSErrno.ERRNO_ERROR, e.getMessage()); + return server.Fail(NSErrno.ERRNO_ERROR, e.getMessage()); } } - - private NSApiResult response(Result result) - { - return NSSDKServer.Resp(result.getCode(), result.getMessage(), result.getData()); - } } diff --git a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Result.java b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Result.java index 9770c05..ae5a95c 100644 --- a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Result.java +++ b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Result.java @@ -1,5 +1,6 @@ package com.ruoyi.agentcenter.object; +import com.nsgk.agentcentersdk.err.NSErrno; import lombok.Data; import lombok.experimental.Accessors; @@ -11,4 +12,9 @@ public class Result private int code; private String message; private R data; + + public boolean IsSuccess() + { + return code == NSErrno.ERRNO_OK; + } } diff --git a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/IAgentCenter.java b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/IAgentCenter.java index 439d9dd..11bf7e2 100644 --- a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/IAgentCenter.java +++ b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/IAgentCenter.java @@ -1,10 +1,11 @@ package com.ruoyi.agentcenter.service; +import com.nsgk.agentcentersdk.api.NSSDKServer; import com.ruoyi.agentcenter.object.Result; import javax.servlet.http.HttpServletRequest; public interface IAgentCenter { - public Result postHandle(HttpServletRequest request); + public Result postHandle(NSSDKServer server, HttpServletRequest request); } diff --git a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/impl/AgentCenterImpl.java b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/impl/AgentCenterImpl.java index cd4e258..d8e4cb6 100644 --- a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/impl/AgentCenterImpl.java +++ b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/impl/AgentCenterImpl.java @@ -1,8 +1,6 @@ package com.ruoyi.agentcenter.service.impl; import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.URLUtil; -import com.nsgk.agentcentersdk.api.NSSDK; import com.nsgk.agentcentersdk.api.NSSDKServer; import com.nsgk.agentcentersdk.core.NSProtocol; import com.nsgk.agentcentersdk.core.NSReportObject; @@ -16,17 +14,13 @@ import com.ruoyi.agentcenter.object.Message; import com.ruoyi.agentcenter.object.Result; import com.ruoyi.agentcenter.object.Session; import com.ruoyi.agentcenter.service.IAgentCenter; -import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.core.domain.entity.SysDept; -import com.ruoyi.common.utils.EventBusEngine; import com.ruoyi.common.utils.handler.HandlerEngine; import com.ruoyi.system.mapper.SysDeptMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; -import java.net.URL; -import java.util.Date; @Service public class AgentCenterImpl implements IAgentCenter @@ -45,14 +39,11 @@ public class AgentCenterImpl implements IAgentCenter return protocol; } - public Message getMessage(HttpServletRequest request) + public Message getMessage(NSSDKServer server, HttpServletRequest request) { - NSSDKServer server; NSReportObject reportObject; Message message; - NSSDK.InitServer(RuoYiConfig.Secret.privateKey); - server = NSSDK.InstanceServer(); int protocol = getProtocol(request); Class clazz; switch(protocol) @@ -113,9 +104,9 @@ public class AgentCenterImpl implements IAgentCenter } @Override - public Result postHandle(HttpServletRequest request) + public Result postHandle(NSSDKServer server, HttpServletRequest request) { - Message message = getMessage(request); + Message message = getMessage(server, request); check(message, request); Session session = createSession(message); HandlerEngine.Post(session);