@@ -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); | ||||