@@ -10,14 +10,19 @@ public class SignatureEnumGroup { | |||||
* 加密字符串的位置 | * 加密字符串的位置 | ||||
*/ | */ | ||||
public static enum SignatureLocation{ | public static enum SignatureLocation{ | ||||
header | |||||
header, | |||||
body | |||||
} | } | ||||
public static enum KeyAlgorithm{ | public static enum KeyAlgorithm{ | ||||
/** | /** | ||||
* RSA | * RSA | ||||
*/ | */ | ||||
RSA | |||||
RSA, | |||||
/** | |||||
* MD5 | |||||
*/ | |||||
MD5 | |||||
} | } | ||||
public static enum KeyType{ | public static enum KeyType{ | ||||
@@ -15,13 +15,13 @@ public abstract class AbstractSignatureService { | |||||
protected SignatureContext signatureContext; | protected SignatureContext signatureContext; | ||||
/** | /** | ||||
* 使用私钥加密 | |||||
* 对content进行加密 | |||||
* | * | ||||
* @param content | * @param content | ||||
* @return | * @return | ||||
* @throws GeneralSecurityException | * @throws GeneralSecurityException | ||||
*/ | */ | ||||
public abstract String signatureByPriKey(String content) throws GeneralSecurityException; | |||||
public abstract String signatureContent(String content) throws GeneralSecurityException; | |||||
void init(SignatureConfig signatureConfig) throws GeneralSecurityException { | void init(SignatureConfig signatureConfig) throws GeneralSecurityException { | ||||
@@ -32,7 +32,7 @@ class RSASignatureService extends AbstractSignatureService { | |||||
} | } | ||||
@Override | @Override | ||||
public String signatureByPriKey(String content) throws GeneralSecurityException { | |||||
public String signatureContent(String content) throws GeneralSecurityException { | |||||
if (signatureContext == null) { | if (signatureContext == null) { | ||||
throw new RuntimeException("未初始化公私钥对信息"); | throw new RuntimeException("未初始化公私钥对信息"); | ||||
} | } | ||||
@@ -22,6 +22,9 @@ public class SignatureFactory { | |||||
case RSA: | case RSA: | ||||
result = RSASignatureService.getInstance(signatureConfig); | result = RSASignatureService.getInstance(signatureConfig); | ||||
break; | break; | ||||
case MD5: | |||||
result = MD5SignatureService.getInstance(signatureConfig); | |||||
break; | |||||
} | } | ||||
if (result == null) { | if (result == null) { | ||||
throw new RuntimeException(String.format("不支持的签名方式,signatureConfig:%s", signatureConfig)); | throw new RuntimeException(String.format("不支持的签名方式,signatureConfig:%s", signatureConfig)); | ||||
@@ -32,6 +32,7 @@ import tech.deepq.common.utils.signature.AbstractSignatureService; | |||||
import tech.deepq.common.utils.signature.SignatureFactory; | import tech.deepq.common.utils.signature.SignatureFactory; | ||||
import tech.deepq.source.request.RequestClient; | import tech.deepq.source.request.RequestClient; | ||||
import tech.deepq.source.spel.CustomRequest; | import tech.deepq.source.spel.CustomRequest; | ||||
import tech.deepq.source.util.TokenUtils; | |||||
import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||
import java.security.GeneralSecurityException; | import java.security.GeneralSecurityException; | ||||
@@ -55,6 +56,7 @@ public class SourceHandler { | |||||
private final StreamBridge streamBridge; | private final StreamBridge streamBridge; | ||||
private final TaskManager taskManager; | private final TaskManager taskManager; | ||||
public final Gson gson; | public final Gson gson; | ||||
public final TokenUtils tokenUtils; | |||||
public List<Message<HttpRes>> handle(Message<TaskMiniVO> message) { | public List<Message<HttpRes>> handle(Message<TaskMiniVO> message) { | ||||
TaskMiniVO taskMiniVO = message.getPayload(); | TaskMiniVO taskMiniVO = message.getPayload(); | ||||
@@ -164,6 +166,7 @@ public class SourceHandler { | |||||
/** | /** | ||||
* 根据当前任务返回值与当前任务的分支配置信息构建将要发送的消息 | * 根据当前任务返回值与当前任务的分支配置信息构建将要发送的消息 | ||||
* | |||||
* @return {@code Map<topic,list<Message>} | * @return {@code Map<topic,list<Message>} | ||||
*/ | */ | ||||
private Map<String, List<Message>> buildNextNodeMessage(List<HttpRes> result, Task task, Message<TaskMiniVO> message) { | private Map<String, List<Message>> buildNextNodeMessage(List<HttpRes> result, Task task, Message<TaskMiniVO> message) { | ||||
@@ -343,10 +346,12 @@ public class SourceHandler { | |||||
AbstractSignatureService signatureService = null; | AbstractSignatureService signatureService = null; | ||||
try { | try { | ||||
signatureService = SignatureFactory.getSignatureService(signatureConfig); | signatureService = SignatureFactory.getSignatureService(signatureConfig); | ||||
String signature = signatureService.signatureByPriKey(signatureContext); | |||||
String signature = signatureService.signatureContent(signatureContext); | |||||
// 优化 | // 优化 | ||||
if (SignatureEnumGroup.SignatureLocation.header.equals(signatureConfig.getSignatureLocation())) { | if (SignatureEnumGroup.SignatureLocation.header.equals(signatureConfig.getSignatureLocation())) { | ||||
requestParams.getHeaders().put(signatureConfig.getSignatureField(), signature); | requestParams.getHeaders().put(signatureConfig.getSignatureField(), signature); | ||||
} else if (SignatureEnumGroup.SignatureLocation.body.equals(signatureConfig.getSignatureLocation())) { | |||||
requestParams.getBody().put(signatureConfig.getSignatureField(), signature); | |||||
} | } | ||||
} catch (GeneralSecurityException e) { | } catch (GeneralSecurityException e) { | ||||
throw new RuntimeException(e); | throw new RuntimeException(e); | ||||
@@ -0,0 +1,73 @@ | |||||
package tech.deepq.source.util; | |||||
import com.alibaba.fastjson2.JSON; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.context.annotation.Lazy; | |||||
import org.springframework.data.redis.core.RedisTemplate; | |||||
import org.springframework.scheduling.annotation.Async; | |||||
import org.springframework.stereotype.Component; | |||||
import org.springframework.util.DigestUtils; | |||||
import tech.deepq.common.dto.HttpRequestParams; | |||||
import tech.deepq.common.dto.HttpRes; | |||||
import tech.deepq.source.request.RequestClient; | |||||
import java.nio.charset.StandardCharsets; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
import java.util.UUID; | |||||
import java.util.concurrent.TimeUnit; | |||||
/** | |||||
* @author yechuan | |||||
* @since 2023/9/1 09:58 | |||||
**/ | |||||
@Component | |||||
public class TokenUtils { | |||||
@Autowired | |||||
private RequestClient requestClient; | |||||
@Autowired | |||||
private RedisTemplate<String, String> redisTemplate; | |||||
@Lazy | |||||
@Autowired | |||||
private TokenUtils proxy; | |||||
private final String TokenFormQHRBCacheKey = "tokenFormQHRBCacheKey"; | |||||
public String getTokenFormQHRB(String partnerId, String partnerNtr) { | |||||
proxy.checkTokenFormQHRB(partnerId, partnerNtr); | |||||
return redisTemplate.opsForValue() | |||||
.get(TokenFormQHRBCacheKey); | |||||
} | |||||
@Async | |||||
public void checkTokenFormQHRB(String partnerId, String partnerNtr) { | |||||
Long expire = redisTemplate.getExpire(TokenFormQHRBCacheKey, TimeUnit.MINUTES); | |||||
if (expire == null) { | |||||
expire = Long.MIN_VALUE; | |||||
} | |||||
if (expire.compareTo(15L) > 0) { | |||||
return; | |||||
} | |||||
Map<String, Object> body = new HashMap<>(); | |||||
String randomNum = UUID.randomUUID().toString().replaceAll("-", ""); | |||||
randomNum = randomNum.substring(randomNum.length() - 8); | |||||
body.put("partnerId", partnerId); | |||||
body.put("randomNum", randomNum); | |||||
body.put("partnerNtr", DigestUtils.md5DigestAsHex((partnerNtr + randomNum).getBytes(StandardCharsets.UTF_8))); | |||||
HttpRequestParams httpRequestParams = new HttpRequestParams(); | |||||
httpRequestParams.setUrl("https://app.qhrb.com.cn/api/user/partner/getTicket"); | |||||
httpRequestParams.setBody(body); | |||||
httpRequestParams.setMethod("POST"); | |||||
HttpRes res = requestClient.execute(httpRequestParams); | |||||
if (!res.getStatus().is2xxSuccessful()) { | |||||
return; | |||||
} | |||||
redisTemplate.opsForValue().set(TokenFormQHRBCacheKey, JSON.parseObject(res.getBody()).getString("dataPoints"), 120, TimeUnit.MINUTES); | |||||
} | |||||
} |
@@ -7,9 +7,9 @@ spring: | |||||
nacos: | nacos: | ||||
config: | config: | ||||
enabled: true | enabled: true | ||||
server-addr: https://nacos-sit.deepq.tech | |||||
server-addr: https://nacos-dev.deepq.tech | |||||
file-extension: yml | file-extension: yml | ||||
namespace: std-news-process-dev | |||||
namespace: std-news-process-local_yechuan | |||||
shared-configs: | shared-configs: | ||||
- data-id: common.yml | - data-id: common.yml | ||||
refresh: true | refresh: true | ||||
@@ -5,9 +5,9 @@ spring: | |||||
nacos: | nacos: | ||||
config: | config: | ||||
enabled: true | enabled: true | ||||
server-addr: https://nacos-sit.deepq.tech | |||||
server-addr: https://nacos-dev.deepq.tech | |||||
file-extension: yml | file-extension: yml | ||||
namespace: std-news-process-dev | |||||
namespace: std-news-process-local_yechuan | |||||
shared-configs: | shared-configs: | ||||
- data-id: common.yml | - data-id: common.yml | ||||
refresh: true | refresh: true | ||||