|
|
@@ -1,6 +1,15 @@
|
|
|
package com.zsElectric.boot.common.util.electric;
|
|
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import com.google.gson.Gson;
|
|
|
import com.google.gson.JsonObject;
|
|
|
+import com.zsElectric.boot.common.constant.ConnectivityConstants;
|
|
|
+import com.zsElectric.boot.common.util.AESCryptoUtil;
|
|
|
+import com.zsElectric.boot.common.util.HmacMD5Util;
|
|
|
+import com.zsElectric.boot.common.util.OkHttpUtil;
|
|
|
+import com.zsElectric.boot.common.util.SequenceGenUtil;
|
|
|
+import com.zsElectric.boot.core.exception.BusinessException;
|
|
|
+import jakarta.annotation.Resource;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.checkerframework.checker.units.qual.A;
|
|
|
@@ -13,12 +22,15 @@ import java.util.concurrent.TimeUnit;
|
|
|
import java.util.concurrent.locks.ReentrantLock;
|
|
|
|
|
|
/**
|
|
|
- * Token管理器 - 负责Token的获取、刷新、存储和有效性检查[2](@ref)
|
|
|
+ * Token管理器 - 负责Token的获取、刷新、存储和有效性检查
|
|
|
*/
|
|
|
@Slf4j
|
|
|
@Component
|
|
|
@RequiredArgsConstructor
|
|
|
public class TokenManager {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private OkHttpUtil okHttpUtil;
|
|
|
|
|
|
private static final String TOKEN_KEY = "api:local:accessToken";
|
|
|
private static final String TOKEN_REFRESH_LOCK_KEY = "api:token:refresh:lock";
|
|
|
@@ -74,7 +86,7 @@ public class TokenManager {
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
- // 获取分布式锁,防止集群环境下多个实例同时刷新Token[2](@ref)
|
|
|
+ // 获取分布式锁,防止集群环境下多个实例同时刷新
|
|
|
String lockKey = TOKEN_REFRESH_LOCK_KEY;
|
|
|
Boolean lockAcquired = redisTemplate.opsForValue().setIfAbsent(
|
|
|
lockKey, "LOCK", 30, TimeUnit.SECONDS);
|
|
|
@@ -135,21 +147,53 @@ public class TokenManager {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 调用第三方接口获取新Token[2](@ref)
|
|
|
+ * 调用第三方接口获取新Token
|
|
|
*/
|
|
|
private ApiToken fetchNewTokenFromRemote() {
|
|
|
try {
|
|
|
- //todo 根据实际情况调用第三方API获取Token
|
|
|
-
|
|
|
-// if (Objects.isNull(response) || !response.get) {
|
|
|
-// log.error("调用第三方接口获取Token失败,apiKey: {}", apiKey);
|
|
|
-// return null;
|
|
|
-// }
|
|
|
+ //调用第三方API获取Token
|
|
|
+ QueryTokenParms queryTokenParms = new QueryTokenParms();
|
|
|
+ queryTokenParms
|
|
|
+ .setOperatorID(ConnectivityConstants.OPERATOR_ID)
|
|
|
+ .setOperatorSecret(ConnectivityConstants.OPERATOR_SECRET);
|
|
|
+
|
|
|
+ RequestParmsEntity requestParms = new RequestParmsEntity();
|
|
|
+ SequenceGenUtil.SequenceResult result = SequenceGenUtil.generate();
|
|
|
+
|
|
|
+ requestParms
|
|
|
+ .setOperatorID(ConnectivityConstants.OPERATOR_ID)
|
|
|
+ .setData(AESCryptoUtil.decrypt(queryTokenParms.toString(),ConnectivityConstants.DATA_SECRET,ConnectivityConstants.DATA_SECRET_IV))
|
|
|
+ .setTimeStamp(result.getTimestamp())
|
|
|
+ .setSeq(result.getSequence())
|
|
|
+ .setSig(HmacMD5Util.genSign(requestParms.getOperatorID(),requestParms.getData(),requestParms.getTimeStamp(),requestParms.getSeq(),ConnectivityConstants.SIG_SECRET));
|
|
|
+
|
|
|
+ JsonObject response = okHttpUtil.doPostForm(ConnectivityConstants.QUERY_TOKEN, BeanUtil.beanToMap(requestParms), null);
|
|
|
+
|
|
|
+ if (Objects.isNull(response)) {
|
|
|
+ log.error("调用第三方接口获取Token失败");
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ Gson gson = new Gson();
|
|
|
+ QueryTokenResponseData responseData = gson.fromJson(response, QueryTokenResponseData.class);
|
|
|
+
|
|
|
+ if (responseData.getSuccStat() == 1){
|
|
|
+ //0-无,1-OperatorID无效
|
|
|
+ String failReason = "";
|
|
|
+ if (responseData.getFailReason() == 0){
|
|
|
+ failReason = "无";
|
|
|
+ }
|
|
|
+ if(responseData.getFailReason() == 1){
|
|
|
+ failReason = "OperatorID无效";
|
|
|
+ }
|
|
|
+ log.error("调用第三方接口获取Token失败,失败原因: {}", failReason);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
ApiToken apiToken = new ApiToken();
|
|
|
-// apiToken.setAccessToken(response.getAccessToken());
|
|
|
-// ApiToken.setTokenAvailableTime(response.getExpiresIn());
|
|
|
-// apiToken.setExpiresIn(response.getExpiresIn());
|
|
|
+ apiToken.setAccessToken("Bearer ");
|
|
|
+ apiToken.setTokenAvailableTime(responseData.getTokenAvailableTime());
|
|
|
+ apiToken.setObtainTime(LocalDateTime.now());
|
|
|
+ apiToken.setExpireTime(apiToken.getObtainTime().plusSeconds(apiToken.getTokenAvailableTime()));
|
|
|
|
|
|
return apiToken;
|
|
|
} catch (Exception e) {
|
|
|
@@ -159,18 +203,17 @@ public class TokenManager {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 设置Token信息并存储到Redis[5](@ref)
|
|
|
+ * 设置Token信息并存储到Redis
|
|
|
*/
|
|
|
private void setupAndStoreToken(String tokenKey, ApiToken token) {
|
|
|
LocalDateTime obtainTime = LocalDateTime.now();
|
|
|
token.setObtainTime(obtainTime);
|
|
|
token.setExpireTime(obtainTime.plusSeconds(token.getTokenAvailableTime()));
|
|
|
-
|
|
|
storeToken(tokenKey, token);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 存储Token到Redis[5](@ref)
|
|
|
+ * 存储Token到Redis
|
|
|
*/
|
|
|
private void storeToken(String apiKey, ApiToken token) {
|
|
|
long expireSeconds = Duration.between(LocalDateTime.now(), token.getExpireTime()).getSeconds();
|