| @@ -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``` | > 客户端手动导入: ```mvn install:install-file -Dfile=agentcenter-sdk-1.0.0nsgk1.jar -DgroupId=com.nsgk -DartifactId=agentcenter-sdk -Dversion=1.0.0nsgk1 -Dpackaging=jar``` | ||||
| > 客户端依赖: | |||||
| ``` | |||||
| <!--代理中心SDK--> | |||||
| <dependency> | |||||
| <groupId>com.nsgk</groupId> | |||||
| <artifactId>agentcenter-sdk</artifactId> | |||||
| <version>1.0.0nsgk1</version> | |||||
| </dependency> | |||||
| ``` | |||||
| --- | --- | ||||
| #### 兼容性 | #### 兼容性 | ||||
| 当版本不一致时 | 当版本不一致时 | ||||
| @@ -37,6 +37,21 @@ public final class NSApiResult | |||||
| this.errno = errno; | 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) | static NSApiResult Success(String msg, Object data) | ||||
| { | { | ||||
| return new NSApiResult(NS_RESULT_SUCCESS, msg, data); | return new NSApiResult(NS_RESULT_SUCCESS, msg, data); | ||||
| @@ -56,7 +71,7 @@ public final class NSApiResult | |||||
| jsonObject.getInteger("code"), | jsonObject.getInteger("code"), | ||||
| jsonObject.getString("msg"), | jsonObject.getString("msg"), | ||||
| jsonObject.containsKey("data") ? jsonObject.get("data") : null, | 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 | jsonObject.containsKey("errno") ? jsonObject.getInteger("errno") : null | ||||
| ); | ); | ||||
| } | } | ||||
| @@ -58,6 +58,16 @@ public final class NSSDK | |||||
| return _identifier.get(); | return _identifier.get(); | ||||
| } | } | ||||
| public static String PrivateKey() | |||||
| { | |||||
| return _privateKey.get(); | |||||
| } | |||||
| public static String PublicKey() | |||||
| { | |||||
| return _publicKey.get(); | |||||
| } | |||||
| public static NSSDKClient InstanceClient() | public static NSSDKClient InstanceClient() | ||||
| { | { | ||||
| if(!NSConv.FALSE(_clientInit.get())) | if(!NSConv.FALSE(_clientInit.get())) | ||||
| @@ -1,6 +1,8 @@ | |||||
| package com.nsgk.agentcentersdk.api; | package com.nsgk.agentcentersdk.api; | ||||
| import cn.hutool.core.util.URLUtil; | 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.NSConstants; | ||||
| import com.nsgk.agentcentersdk.core.NSProtocol; | import com.nsgk.agentcentersdk.core.NSProtocol; | ||||
| import com.nsgk.agentcentersdk.core.NSReportObject; | import com.nsgk.agentcentersdk.core.NSReportObject; | ||||
| @@ -67,7 +69,7 @@ public final class NSSDKClient | |||||
| NSNetworkResponse response = NSNetworkManager.Post(request); | NSNetworkResponse response = NSNetworkManager.Post(request); | ||||
| NSErrGlobal.ASSERT(response.IsSuccess(), NSErrno.ERRNO_SYS_HTTP); | NSErrGlobal.ASSERT(response.IsSuccess(), NSErrno.ERRNO_SYS_HTTP); | ||||
| String json = response.getData(); | String json = response.getData(); | ||||
| return NSApiResult.FromJSON(json); | |||||
| return FromJSON(json); | |||||
| } | } | ||||
| private String BuildUrl(String url) | private String BuildUrl(String url) | ||||
| @@ -87,7 +89,7 @@ public final class NSSDKClient | |||||
| dataStr = object.getDataStr(); | dataStr = object.getDataStr(); | ||||
| try | try | ||||
| { | { | ||||
| dataStr = NSCrypto.RSAEncrypt(dataStr, publicKey); | |||||
| dataStr = NSCrypto.RSAEncrypt_publicKey(dataStr, publicKey); | |||||
| NSAssert.NotEmpty(dataStr, NSErrno.ERRNO_SYS_ENCRYPT_FAIL); | NSAssert.NotEmpty(dataStr, NSErrno.ERRNO_SYS_ENCRYPT_FAIL); | ||||
| } | } | ||||
| catch(Exception e) | catch(Exception e) | ||||
| @@ -98,4 +100,28 @@ public final class NSSDKClient | |||||
| } | } | ||||
| request.setData(dataStr); | 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; | |||||
| } | |||||
| } | } | ||||
| @@ -1,5 +1,6 @@ | |||||
| package com.nsgk.agentcentersdk.api; | package com.nsgk.agentcentersdk.api; | ||||
| import com.alibaba.fastjson2.JSON; | |||||
| import com.nsgk.agentcentersdk.core.NSConstants; | import com.nsgk.agentcentersdk.core.NSConstants; | ||||
| import com.nsgk.agentcentersdk.core.NSProtocol; | import com.nsgk.agentcentersdk.core.NSProtocol; | ||||
| import com.nsgk.agentcentersdk.core.NSReportObject; | 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.NSCrypto; | ||||
| import com.nsgk.agentcentersdk.utility.NSHttp; | import com.nsgk.agentcentersdk.utility.NSHttp; | ||||
| import javax.servlet.ServletInputStream; | |||||
| import javax.servlet.http.HttpServletRequest; | import javax.servlet.http.HttpServletRequest; | ||||
| // SDK服务端 | // SDK服务端 | ||||
| @@ -55,7 +55,7 @@ public final class NSSDKServer | |||||
| ; | ; | ||||
| try | try | ||||
| { | { | ||||
| data = NSCrypto.RSADecrypt(data, privateKey); | |||||
| data = NSCrypto.RSADecrypt_privateKey(data, privateKey); | |||||
| NSAssert.NotEmpty(data, NSErrno.ERRNO_SYS_DECRYPT_FAIL); | NSAssert.NotEmpty(data, NSErrno.ERRNO_SYS_DECRYPT_FAIL); | ||||
| res.SetDataStr(data, clazz); | res.SetDataStr(data, clazz); | ||||
| NSErrGlobal.ASSERT(res.getData().Normalized() == 0, NSErrno.ERRNO_SYS_INVALID_FIELD); | 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; | |||||
| } | |||||
| } | } | ||||
| @@ -9,10 +9,21 @@ import cn.hutool.crypto.asymmetric.RSA; | |||||
| import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||
| // 加密工具 | // 加密工具 | ||||
| // 加密数据返回都为base64, 解密数据传参都为base64 | |||||
| // 客户端存放公钥, 服务端存放私钥 | |||||
| /* | |||||
| / ---------> \ | |||||
| 公钥加密 \ / -> 私钥解密 | |||||
| / \ / \ | |||||
| 客户端 服务端 处理/返回响应 | |||||
| \ / \ / | |||||
| 公钥解密 / \ <- 私钥加密 | |||||
| \ <--------- / | |||||
| */ | |||||
| public final class NSCrypto | public final class NSCrypto | ||||
| { | { | ||||
| // RSA公钥加密(客户端) raw -> base64 | // RSA公钥加密(客户端) raw -> base64 | ||||
| public static String RSAEncrypt(String rawData, String publicKey_base64) | |||||
| public static String RSAEncrypt_publicKey(String rawData, String publicKey_base64) | |||||
| { | { | ||||
| RSA rsa; | RSA rsa; | ||||
| @@ -23,7 +34,7 @@ public final class NSCrypto | |||||
| } | } | ||||
| // RSA私钥解密(服务端) base64 -> raw | // RSA私钥解密(服务端) base64 -> raw | ||||
| public static String RSADecrypt(String encryptBase64Data, String privateKey_base64) | |||||
| public static String RSADecrypt_privateKey(String encryptBase64Data, String privateKey_base64) | |||||
| { | { | ||||
| RSA rsa; | RSA rsa; | ||||
| @@ -33,5 +44,27 @@ public final class NSCrypto | |||||
| return StrUtil.str(rsa.decrypt(Base64.decode(encryptBase64Data), KeyType.PrivateKey), StandardCharsets.UTF_8); | 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() {} | private NSCrypto() {} | ||||
| } | } | ||||
| @@ -53,23 +53,22 @@ public class AgentCenterController extends BaseController | |||||
| @PostMapping("/report") | @PostMapping("/report") | ||||
| public NSApiResult report(HttpServletRequest request) | public NSApiResult report(HttpServletRequest request) | ||||
| { | { | ||||
| NSSDKServer server; | |||||
| NSSDK.InitServer(RuoYiConfig.Secret.privateKey); | |||||
| server = NSSDK.InstanceServer(); | |||||
| try | 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) | catch(NSException e) | ||||
| { | { | ||||
| return NSSDKServer.Fail(e.getErrno(), e.getMessage()); | |||||
| return server.Fail(e.getErrno(), e.getMessage()); | |||||
| } | } | ||||
| catch(Exception e) | 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()); | |||||
| } | |||||
| } | } | ||||
| @@ -1,5 +1,6 @@ | |||||
| package com.ruoyi.agentcenter.object; | package com.ruoyi.agentcenter.object; | ||||
| import com.nsgk.agentcentersdk.err.NSErrno; | |||||
| import lombok.Data; | import lombok.Data; | ||||
| import lombok.experimental.Accessors; | import lombok.experimental.Accessors; | ||||
| @@ -11,4 +12,9 @@ public class Result<R> | |||||
| private int code; | private int code; | ||||
| private String message; | private String message; | ||||
| private R data; | private R data; | ||||
| public boolean IsSuccess() | |||||
| { | |||||
| return code == NSErrno.ERRNO_OK; | |||||
| } | |||||
| } | } | ||||
| @@ -1,10 +1,11 @@ | |||||
| package com.ruoyi.agentcenter.service; | package com.ruoyi.agentcenter.service; | ||||
| import com.nsgk.agentcentersdk.api.NSSDKServer; | |||||
| import com.ruoyi.agentcenter.object.Result; | import com.ruoyi.agentcenter.object.Result; | ||||
| import javax.servlet.http.HttpServletRequest; | import javax.servlet.http.HttpServletRequest; | ||||
| public interface IAgentCenter | public interface IAgentCenter | ||||
| { | { | ||||
| public Result<?> postHandle(HttpServletRequest request); | |||||
| public Result<?> postHandle(NSSDKServer server, HttpServletRequest request); | |||||
| } | } | ||||
| @@ -1,8 +1,6 @@ | |||||
| package com.ruoyi.agentcenter.service.impl; | package com.ruoyi.agentcenter.service.impl; | ||||
| import cn.hutool.core.lang.Assert; | 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.api.NSSDKServer; | ||||
| import com.nsgk.agentcentersdk.core.NSProtocol; | import com.nsgk.agentcentersdk.core.NSProtocol; | ||||
| import com.nsgk.agentcentersdk.core.NSReportObject; | 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.Result; | ||||
| import com.ruoyi.agentcenter.object.Session; | import com.ruoyi.agentcenter.object.Session; | ||||
| import com.ruoyi.agentcenter.service.IAgentCenter; | import com.ruoyi.agentcenter.service.IAgentCenter; | ||||
| import com.ruoyi.common.config.RuoYiConfig; | |||||
| import com.ruoyi.common.core.domain.entity.SysDept; | import com.ruoyi.common.core.domain.entity.SysDept; | ||||
| import com.ruoyi.common.utils.EventBusEngine; | |||||
| import com.ruoyi.common.utils.handler.HandlerEngine; | import com.ruoyi.common.utils.handler.HandlerEngine; | ||||
| import com.ruoyi.system.mapper.SysDeptMapper; | import com.ruoyi.system.mapper.SysDeptMapper; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||
| import javax.servlet.http.HttpServletRequest; | import javax.servlet.http.HttpServletRequest; | ||||
| import java.net.URL; | |||||
| import java.util.Date; | |||||
| @Service | @Service | ||||
| public class AgentCenterImpl implements IAgentCenter | public class AgentCenterImpl implements IAgentCenter | ||||
| @@ -45,14 +39,11 @@ public class AgentCenterImpl implements IAgentCenter | |||||
| return protocol; | return protocol; | ||||
| } | } | ||||
| public Message<?> getMessage(HttpServletRequest request) | |||||
| public Message<?> getMessage(NSSDKServer server, HttpServletRequest request) | |||||
| { | { | ||||
| NSSDKServer server; | |||||
| NSReportObject<?> reportObject; | NSReportObject<?> reportObject; | ||||
| Message<?> message; | Message<?> message; | ||||
| NSSDK.InitServer(RuoYiConfig.Secret.privateKey); | |||||
| server = NSSDK.InstanceServer(); | |||||
| int protocol = getProtocol(request); | int protocol = getProtocol(request); | ||||
| Class<? extends NSEntity> clazz; | Class<? extends NSEntity> clazz; | ||||
| switch(protocol) | switch(protocol) | ||||
| @@ -113,9 +104,9 @@ public class AgentCenterImpl implements IAgentCenter | |||||
| } | } | ||||
| @Override | @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); | check(message, request); | ||||
| Session<?, ?> session = createSession(message); | Session<?, ?> session = createSession(message); | ||||
| HandlerEngine.Post(session); | HandlerEngine.Post(session); | ||||