@@ -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``` | |||
> 客户端依赖: | |||
``` | |||
<!--代理中心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; | |||
} | |||
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 | |||
); | |||
} | |||
@@ -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())) | |||
@@ -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; | |||
} | |||
} |
@@ -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; | |||
} | |||
} |
@@ -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() {} | |||
} |
@@ -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()); | |||
} | |||
} |
@@ -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<R> | |||
private int code; | |||
private String message; | |||
private R data; | |||
public boolean IsSuccess() | |||
{ | |||
return code == NSErrno.ERRNO_OK; | |||
} | |||
} |
@@ -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); | |||
} |
@@ -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<? extends NSEntity> 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); | |||