You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
5.7 KiB
185 lines
5.7 KiB
using Newtonsoft.Json;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Net.Http;
|
|
using System.Net.Http.Headers;
|
|
using System.Text;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
namespace TaskManager.Controllers
|
|
{
|
|
public class TOKEN_CONTROLLER
|
|
{
|
|
|
|
private readonly HttpClient _httpClient;
|
|
private readonly string _appKey = "8EG566b9bedd2bf46d";
|
|
private readonly string _appSecret = "48edc4425647425d87f806a1ba492580"; // 若有密钥需传入
|
|
|
|
public TOKEN_CONTROLLER()
|
|
{
|
|
_httpClient = new HttpClient();
|
|
|
|
|
|
|
|
}
|
|
public async Task ExecuteAsync()
|
|
{
|
|
try
|
|
{
|
|
var retult = await GetTokenAsync("https://ediuat.mychery.com/prod-api/auth/public/login/appKey");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(ex.Message);
|
|
}
|
|
|
|
}
|
|
|
|
public async Task<string> GetTokenAsync(string tokenUrl)
|
|
{
|
|
var parameters = new
|
|
{
|
|
appKey = _appKey,
|
|
appSecret = _appSecret, // 按需传参
|
|
// 其他参数如 grant_type、scope 等根据接口要求调整
|
|
};
|
|
|
|
var content = new StringContent(
|
|
JsonConvert.SerializeObject(parameters),
|
|
Encoding.UTF8,
|
|
"application/json"
|
|
);
|
|
var response = await _httpClient.PostAsync(tokenUrl, content);
|
|
response.EnsureSuccessStatusCode(); // 抛异常处理错误
|
|
var responseBody = await response.Content.ReadAsStringAsync();
|
|
var result = JsonConvert.DeserializeObject<dynamic>(responseBody);
|
|
return result.data.access_token; // 假设返回字段为 access_token
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
//private readonly string _appKey = "8EG566b9bedd2bf46d";
|
|
//private readonly string _appSecret = "48edc4425647425d87f806a1ba492580";
|
|
//private readonly string _tokenEndpoint = "https://ediuat.mychery.com/prod-api/auth/public/login/appKey";
|
|
|
|
//private readonly HttpClient _httpClient;
|
|
//private readonly SemaphoreSlim _refreshLock = new SemaphoreSlim(1, 1);
|
|
//private string _currentToken;
|
|
//private DateTime _tokenExpiry;
|
|
//private bool _disposed;
|
|
|
|
//public TokenServiceController()
|
|
//{
|
|
// _httpClient = new HttpClient();
|
|
// _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
|
|
//}
|
|
|
|
//public async Task<string> GetTokenAsync(CancellationToken cancellationToken = default)
|
|
//{
|
|
// // 检查令牌是否存在且未过期(提前60秒刷新以防止边缘情况)
|
|
// if (!string.IsNullOrEmpty(_currentToken) && _tokenExpiry > DateTime.UtcNow.AddSeconds(60))
|
|
// {
|
|
// return _currentToken;
|
|
// }
|
|
|
|
// // 等待获取锁,确保只有一个线程刷新令牌
|
|
// await _refreshLock.WaitAsync(cancellationToken);
|
|
// try
|
|
// {
|
|
// // 再次检查,避免其他线程已经刷新了令牌
|
|
// if (!string.IsNullOrEmpty(_currentToken) && _tokenExpiry > DateTime.UtcNow.AddSeconds(60))
|
|
// {
|
|
// return _currentToken;
|
|
// }
|
|
|
|
// // 调用认证API获取新令牌
|
|
// var tokenResponse = await FetchNewTokenAsync(cancellationToken);
|
|
|
|
// // 更新令牌和过期时间
|
|
// _currentToken = tokenResponse.AccessToken;
|
|
// _tokenExpiry = DateTime.UtcNow.AddSeconds(tokenResponse.ExpiresIn);
|
|
|
|
// return _currentToken;
|
|
// }
|
|
// finally
|
|
// {
|
|
// _refreshLock.Release();
|
|
// }
|
|
//}
|
|
|
|
//private async Task<TokenResponse> FetchNewTokenAsync(CancellationToken cancellationToken)
|
|
//{
|
|
// try
|
|
// {
|
|
// // 创建请求内容
|
|
// var requestBody = new
|
|
// {
|
|
// appKey = _appKey,
|
|
// appSecret = _appSecret
|
|
// };
|
|
|
|
// var content = new StringContent(
|
|
// JsonSerializer.Serialize(requestBody),
|
|
// Encoding.UTF8,
|
|
// "application/json");
|
|
|
|
// // 发送请求
|
|
// var response = await _httpClient.PostAsync(_tokenEndpoint, content, cancellationToken);
|
|
// response.EnsureSuccessStatusCode();
|
|
|
|
// // 解析响应
|
|
// var jsonResponse = await response.Content.ReadAsStringAsync(cancellationToken);
|
|
// var tokenResponse = JsonSerializer.Deserialize<TokenResponse>(
|
|
// jsonResponse,
|
|
// new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
|
|
|
|
// if (tokenResponse == null || string.IsNullOrEmpty(tokenResponse.AccessToken))
|
|
// {
|
|
// throw new InvalidOperationException("Failed to retrieve access token.");
|
|
// }
|
|
|
|
// return tokenResponse;
|
|
// }
|
|
// catch (Exception ex)
|
|
// {
|
|
// Console.WriteLine($"Token acquisition failed: {ex.Message}");
|
|
// throw;
|
|
// }
|
|
//}
|
|
|
|
//// 令牌响应模型
|
|
//private class TokenResponse
|
|
//{
|
|
// public string AccessToken { get; set; }
|
|
// public int ExpiresIn { get; set; } = 3600; // 默认1小时
|
|
//}
|
|
|
|
//public void Dispose()
|
|
//{
|
|
// Dispose(true);
|
|
// GC.SuppressFinalize(this);
|
|
//}
|
|
|
|
//protected virtual void Dispose(bool disposing)
|
|
//{
|
|
// if (!_disposed)
|
|
// {
|
|
// if (disposing)
|
|
// {
|
|
// _httpClient?.Dispose();
|
|
// _refreshLock?.Dispose();
|
|
// }
|
|
// _disposed = true;
|
|
// }
|
|
//}
|
|
|
|
//public Task ExecuteAsync()
|
|
//{
|
|
// throw new NotImplementedException();
|
|
//}
|
|
}
|
|
|