获取token改为全局变量

This commit is contained in:
邱贞招 2023-11-18 11:06:01 +08:00
parent 12a6d3ed5e
commit a37699ec1c
2 changed files with 56 additions and 39 deletions

View File

@ -2,6 +2,8 @@ package com.ruoyi.common.utils.onenet;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.common.utils.http.HttpUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.crypto.Mac; import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
@ -10,16 +12,34 @@ import java.net.URLEncoder;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.Base64; import java.util.Base64;
import java.util.concurrent.TimeUnit;
@Component
public class Token { public class Token {
// IP地址查询 @Value(value = "${watering.version}")
public static final String URL = "http://iot-api.heclouds.com/datapoint/history-datapoints"; private static String version;
public static final String synccmdsUrl = "http://iot-api.heclouds.com/datapoint/synccmds?product_id=50dd83E8zQ&device_name=4827E2945C54&timeout=10";
public static String assembleToken(String version, String resourceName, String expirationTime, String signatureMethod, String accessKey) @Value(value = "${watering.resourceName}")
throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException { private static String resourceName;
@Value(value = "${watering.accessKey}")
private static String accessKey;
@Value(value = "${watering.daysToExpire}")
private static Long daysToExpire;
private static String cachedToken;
private static long tokenExpirationTime;
public static String getToken()throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
/** 判断token是否过期如果不过期直接返回全局缓存token,如果过期重新获取token保存到全局缓存token中并更新过期时间*/
if (isTokenExpired()) {
long expirationTimeInSeconds = TimeUnit.DAYS.toSeconds(daysToExpire);
String expirationTime = String.valueOf(System.currentTimeMillis() / 1000 + expirationTimeInSeconds);
String signatureMethod = Token.SignatureMethod.SHA256.name().toLowerCase();//签名方式
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
String res = URLEncoder.encode(resourceName, "UTF-8"); String res = URLEncoder.encode(resourceName, "UTF-8");
String sig = URLEncoder.encode(generatorSignature(version, resourceName, expirationTime, accessKey, signatureMethod), "UTF-8"); String sig = URLEncoder.encode(generatorSignature(version, resourceName, expirationTime, accessKey, signatureMethod), "UTF-8");
@ -33,7 +53,12 @@ public class Token {
.append(signatureMethod) .append(signatureMethod)
.append("&sign=") .append("&sign=")
.append(sig); .append(sig);
return sb.toString(); cachedToken = sb.toString();
// 更新 token 过期时间
tokenExpirationTime = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(expirationTimeInSeconds);
return cachedToken;
}
return cachedToken;
} }
public static String generatorSignature(String version, String resourceName, String expirationTime, String accessKey, String signatureMethod) public static String generatorSignature(String version, String resourceName, String expirationTime, String accessKey, String signatureMethod)
@ -67,21 +92,20 @@ public class Token {
SHA1, MD5, SHA256; SHA1, MD5, SHA256;
} }
/**判断token是否过期*/
private static boolean isTokenExpired() {
return cachedToken == null || System.currentTimeMillis() > tokenExpirationTime;
}
public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException { public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
String version = "2020-05-29";//签名算法版本 String token = getToken();
String resourceName = "userid/143831";//用户id
String expirationTime = System.currentTimeMillis() / 1000 + 100 * 24 * 60 * 60 + "";//过期时间
String signatureMethod = SignatureMethod.SHA256.name().toLowerCase();//签名方式
String accessKey = "dJqF0qYhUbK/o1Pr9I5qxNoP14FlJLC+BFK2ZTjUX+lnKwoNYvBYsM/7Xu1ERIzSkUoxVkP/N1RMvGlBKMoBtA==";
String token = assembleToken(version, resourceName, expirationTime, signatureMethod, accessKey);
System.out.println("Authorization:" + token); System.out.println("Authorization:" + token);
String rspStr = HttpUtils.sendGet(URL, token, Constants.UTF8); String iotUrl = "https://iot-api.heclouds.com/datapoint";
HttpUtils.sendPostWithToken(synccmdsUrl,"",token);
String rspStr = HttpUtils.sendGet(iotUrl, token, Constants.UTF8);
HttpUtils.sendPostWithToken(iotUrl,"open",token);
// HttpUtils.sendGet() // HttpUtils.sendGet()
} }
} }

View File

@ -23,7 +23,6 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
import static com.ruoyi.common.utils.SecurityUtils.getUsername; import static com.ruoyi.common.utils.SecurityUtils.getUsername;
@ -147,10 +146,7 @@ public class AsDeviceServiceImpl extends ServiceImpl<AsDeviceMapper, AsDevice> i
String param = "device_name=" + deviceName + "&product_id=" + productId +"&timeout=" + timeout; String param = "device_name=" + deviceName + "&product_id=" + productId +"&timeout=" + timeout;
String sendUrl = iotUrl+ IotConstants.ADDS_COMMAND + "?"+param; String sendUrl = iotUrl+ IotConstants.ADDS_COMMAND + "?"+param;
long expirationTimeInSeconds = TimeUnit.DAYS.toSeconds(daysToExpire); String token = Token.getToken();
String expirationTime = String.valueOf(System.currentTimeMillis() / 1000 + expirationTimeInSeconds);
String signatureMethod = Token.SignatureMethod.SHA256.name().toLowerCase();//签名方式
String token = Token.assembleToken(version, resourceName, expirationTime, signatureMethod, accessKey);
logger.info("IOT获取到Authorization:【{}】",token); logger.info("IOT获取到Authorization:【{}】",token);
String result = HttpUtils.sendPostWithToken(sendUrl, command, token); String result = HttpUtils.sendPostWithToken(sendUrl, command, token);
@ -250,10 +246,7 @@ public class AsDeviceServiceImpl extends ServiceImpl<AsDeviceMapper, AsDevice> i
logger.info("IOT请求地址:【{}】", sendUrl); logger.info("IOT请求地址:【{}】", sendUrl);
/** 2.获取token */ /** 2.获取token */
long expirationTimeInSeconds = TimeUnit.DAYS.toSeconds(daysToExpire); String token = Token.getToken();
String expirationTime = String.valueOf(System.currentTimeMillis() / 1000 + expirationTimeInSeconds);
String signatureMethod = Token.SignatureMethod.SHA256.name().toLowerCase();//签名方式
String token = Token.assembleToken(version, resourceName, expirationTime, signatureMethod, accessKey);
logger.info("IOT获取到Authorization:【{}】",token); logger.info("IOT获取到Authorization:【{}】",token);
/** 3.请求下发 */ /** 3.请求下发 */