diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2022-04-07 17:58:50 +0300 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2022-04-07 17:58:50 +0300 |
commit | e0e54ef0c9f95fa670474e8e51a6e722af3c4134 (patch) | |
tree | c52d0fbfaeb3a3bbbade61abc321d045fbd52765 | |
parent | 24dac332ee24c938b9c7da2c3e4636e1df5b8eb6 (diff) |
Force access token refresh
-rw-r--r-- | TuyaApi.cs | 21 | ||||
-rw-r--r-- | TuyaDevice.cs | 11 |
2 files changed, 18 insertions, 14 deletions
@@ -111,8 +111,9 @@ namespace com.clusterrr.TuyaNet /// <param name="body">Body of request if any.</param>
/// <param name="headers">Additional headers.</param>
/// <param name="noToken">Execute query without token.</param>
+ /// <param name="forceTokenRefresh">Refresh access token even it's not expired.</param>
/// <returns>JSON string with response.</returns>
- public async Task<string> RequestAsync(Method method, string uri, string body = null, Dictionary<string, string> headers = null, bool noToken = false)
+ public async Task<string> RequestAsync(Method method, string uri, string body = null, Dictionary<string, string> headers = null, bool noToken = false, bool forceTokenRefresh = false)
{
while (uri.StartsWith("/")) uri = uri.Substring(1);
var urlHost = RegionToHost(region);
@@ -137,7 +138,7 @@ namespace com.clusterrr.TuyaNet }
else
{
- await RefreshAccessTokenAsync();
+ await RefreshAccessTokenAsync(forceTokenRefresh);
payload = accessId + token.AccessToken + now;
}
@@ -193,9 +194,9 @@ namespace com.clusterrr.TuyaNet /// <summary>
/// Request access token if it's expired or not requested yet.
/// </summary>
- private async Task RefreshAccessTokenAsync()
+ private async Task RefreshAccessTokenAsync(bool force = false)
{
- if ((token == null) || (tokenTime.AddSeconds(token.ExpireTime) >= DateTime.Now))
+ if (force || (token == null) || (tokenTime.AddSeconds(token.ExpireTime) >= DateTime.Now))
{
var uri = "v1.0/token?grant_type=1";
var response = await RequestAsync(Method.GET, uri, noToken: true);
@@ -208,11 +209,12 @@ namespace com.clusterrr.TuyaNet /// Requests info about device by it's ID.
/// </summary>
/// <param name="deviceId">Device ID.</param>
+ /// <param name="forceTokenRefresh">Refresh access token even it's not expired.</param>
/// <returns>Device info.</returns>
- public async Task<TuyaDeviceApiInfo> GetDeviceInfoAsync(string deviceId)
+ public async Task<TuyaDeviceApiInfo> GetDeviceInfoAsync(string deviceId, bool forceTokenRefresh = false)
{
var uri = $"v1.0/devices/{deviceId}";
- var response = await RequestAsync(Method.GET, uri);
+ var response = await RequestAsync(Method.GET, uri, forceTokenRefresh: forceTokenRefresh);
var device = JsonConvert.DeserializeObject<TuyaDeviceApiInfo>(response);
return device;
}
@@ -221,12 +223,13 @@ namespace com.clusterrr.TuyaNet /// Requests info about all registered devices, requires ID of any registered device.
/// </summary>
/// <param name="anyDeviceId">ID of any registered device.</param>
+ /// <param name="forceTokenRefresh">Refresh access token even it's not expired.</param>
/// <returns>Array of devices info.</returns>
- public async Task<TuyaDeviceApiInfo[]> GetAllDevicesInfoAsync(string anyDeviceId)
+ public async Task<TuyaDeviceApiInfo[]> GetAllDevicesInfoAsync(string anyDeviceId, bool forceTokenRefresh = false)
{
- var userId = (await GetDeviceInfoAsync(anyDeviceId)).UserId;
+ var userId = (await GetDeviceInfoAsync(anyDeviceId, forceTokenRefresh: forceTokenRefresh)).UserId;
var uri = $"v1.0/users/{userId}/devices";
- var response = await RequestAsync(Method.GET, uri);
+ var response = await RequestAsync(Method.GET, uri, forceTokenRefresh: false); // Token already refreshed
var devices = JsonConvert.DeserializeObject<TuyaDeviceApiInfo[]>(response);
return devices;
}
diff --git a/TuyaDevice.cs b/TuyaDevice.cs index 83523b4..f5e0b78 100644 --- a/TuyaDevice.cs +++ b/TuyaDevice.cs @@ -169,7 +169,7 @@ namespace com.clusterrr.TuyaNet client = new TcpClient(IP, Port);
var stream = client.GetStream();
await stream.WriteAsync(data, 0, data.Length).ConfigureAwait(false);
- return await Receive(stream, nullRetries);
+ return await ReceiveAsync(stream, nullRetries);
}
catch (Exception ex) when (ex is IOException or TimeoutException)
{
@@ -191,7 +191,7 @@ namespace com.clusterrr.TuyaNet throw lastException;
}
- private async Task<byte[]> Receive(NetworkStream stream, int nullRetries = 1)
+ private async Task<byte[]> ReceiveAsync(NetworkStream stream, int nullRetries = 1)
{
byte[] result;
byte[] buffer = new byte[1024];
@@ -225,7 +225,7 @@ namespace com.clusterrr.TuyaNet {
try
{
- result = await Receive(stream, nullRetries - 1);
+ result = await ReceiveAsync(stream, nullRetries - 1);
}
catch { }
}
@@ -383,12 +383,13 @@ namespace com.clusterrr.TuyaNet /// <summary>
/// Get current local key from Tuya Cloud API
/// </summary>
- public async Task RefreshLocalKeyAsync()
+ /// <param name="forceTokenRefresh">Refresh access token even it's not expired.</param>
+ public async Task RefreshLocalKeyAsync(bool forceTokenRefresh = false)
{
if (string.IsNullOrEmpty(accessId)) throw new ArgumentException("Access ID is not specified", "accessId");
if (string.IsNullOrEmpty(apiSecret)) throw new ArgumentException("API secret is not specified", "apiSecret");
var api = new TuyaApi(region, accessId, apiSecret);
- var deviceInfo = await api.GetDeviceInfoAsync(DeviceId);
+ var deviceInfo = await api.GetDeviceInfoAsync(DeviceId, forceTokenRefresh: forceTokenRefresh);
LocalKey = deviceInfo.LocalKey;
}
|