From a37699ec1cf69779dbd08c4d0f47b6ba4e06c42a Mon Sep 17 00:00:00 2001 From: 18650502300 <18650502300@163.com> Date: Sat, 18 Nov 2023 11:06:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96token=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/utils/onenet/Token.java | 84 ++++++++++++------- .../service/impl/AsDeviceServiceImpl.java | 11 +-- 2 files changed, 56 insertions(+), 39 deletions(-) diff --git a/AutoSprout-common/src/main/java/com/ruoyi/common/utils/onenet/Token.java b/AutoSprout-common/src/main/java/com/ruoyi/common/utils/onenet/Token.java index 0d95fa8..253ba50 100644 --- a/AutoSprout-common/src/main/java/com/ruoyi/common/utils/onenet/Token.java +++ b/AutoSprout-common/src/main/java/com/ruoyi/common/utils/onenet/Token.java @@ -2,6 +2,8 @@ package com.ruoyi.common.utils.onenet; import com.ruoyi.common.constant.Constants; 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.spec.SecretKeySpec; @@ -10,30 +12,53 @@ import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Base64; +import java.util.concurrent.TimeUnit; - +@Component public class Token { - // IP地址查询 - public static final String URL = "http://iot-api.heclouds.com/datapoint/history-datapoints"; - public static final String synccmdsUrl = "http://iot-api.heclouds.com/datapoint/synccmds?product_id=50dd83E8zQ&device_name=4827E2945C54&timeout=10"; + @Value(value = "${watering.version}") + private static String version; - public static String assembleToken(String version, String resourceName, String expirationTime, String signatureMethod, String accessKey) - throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException { - StringBuilder sb = new StringBuilder(); - String res = URLEncoder.encode(resourceName, "UTF-8"); - String sig = URLEncoder.encode(generatorSignature(version, resourceName, expirationTime, accessKey, signatureMethod), "UTF-8"); - sb.append("version=") - .append(version) - .append("&res=") - .append(res) - .append("&et=") - .append(expirationTime) - .append("&method=") - .append(signatureMethod) - .append("&sign=") - .append(sig); - return sb.toString(); + @Value(value = "${watering.resourceName}") + 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(); + String res = URLEncoder.encode(resourceName, "UTF-8"); + String sig = URLEncoder.encode(generatorSignature(version, resourceName, expirationTime, accessKey, signatureMethod), "UTF-8"); + sb.append("version=") + .append(version) + .append("&res=") + .append(res) + .append("&et=") + .append(expirationTime) + .append("&method=") + .append(signatureMethod) + .append("&sign=") + .append(sig); + 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) @@ -67,21 +92,20 @@ public class Token { SHA1, MD5, SHA256; } + /**判断token是否过期*/ + private static boolean isTokenExpired() { + return cachedToken == null || System.currentTimeMillis() > tokenExpirationTime; + } + public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException { - String version = "2020-05-29";//签名算法版本 - 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); + String token = getToken(); System.out.println("Authorization:" + token); - String rspStr = HttpUtils.sendGet(URL, token, Constants.UTF8); - HttpUtils.sendPostWithToken(synccmdsUrl,"",token); - + String iotUrl = "https://iot-api.heclouds.com/datapoint"; + String rspStr = HttpUtils.sendGet(iotUrl, token, Constants.UTF8); + HttpUtils.sendPostWithToken(iotUrl,"open",token); // HttpUtils.sendGet() - } } diff --git a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsDeviceServiceImpl.java b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsDeviceServiceImpl.java index daa84cc..ccc5366 100644 --- a/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsDeviceServiceImpl.java +++ b/AutoSprout-watering/src/main/java/com/ruoyi/device/service/impl/AsDeviceServiceImpl.java @@ -23,7 +23,6 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; -import java.util.concurrent.TimeUnit; import static com.ruoyi.common.utils.SecurityUtils.getUsername; @@ -147,10 +146,7 @@ public class AsDeviceServiceImpl extends ServiceImpl i String param = "device_name=" + deviceName + "&product_id=" + productId +"&timeout=" + timeout; String sendUrl = iotUrl+ IotConstants.ADDS_COMMAND + "?"+param; - long expirationTimeInSeconds = TimeUnit.DAYS.toSeconds(daysToExpire); - String expirationTime = String.valueOf(System.currentTimeMillis() / 1000 + expirationTimeInSeconds); - String signatureMethod = Token.SignatureMethod.SHA256.name().toLowerCase();//签名方式 - String token = Token.assembleToken(version, resourceName, expirationTime, signatureMethod, accessKey); + String token = Token.getToken(); logger.info("IOT获取到Authorization:【{}】",token); String result = HttpUtils.sendPostWithToken(sendUrl, command, token); @@ -250,10 +246,7 @@ public class AsDeviceServiceImpl extends ServiceImpl i logger.info("IOT请求地址:【{}】", sendUrl); /** 2.获取token */ - long expirationTimeInSeconds = TimeUnit.DAYS.toSeconds(daysToExpire); - String expirationTime = String.valueOf(System.currentTimeMillis() / 1000 + expirationTimeInSeconds); - String signatureMethod = Token.SignatureMethod.SHA256.name().toLowerCase();//签名方式 - String token = Token.assembleToken(version, resourceName, expirationTime, signatureMethod, accessKey); + String token = Token.getToken(); logger.info("IOT获取到Authorization:【{}】",token); /** 3.请求下发 */