【阿里云】通过OpenAPI获取Token(C#)
使用 C# 实现 https://help.aliyun.com/zh/isi/getting-started/use-http-or-https-to-obtain-an-access-token
public static class TokenHelper { public static async Task<string> GetAccessTokenAsync(string accessKeyId, string accessKeySecret) { var queryParamsMap = new Dictionary<string, string>(); queryParamsMap.Add("AccessKeyId", accessKeyId); queryParamsMap.Add("Action", "CreateToken"); queryParamsMap.Add("Version", "2019-02-28"); queryParamsMap.Add("Timestamp", GetISO8601Time()); queryParamsMap.Add("Format", "JSON"); queryParamsMap.Add("RegionId", "cn-shanghai"); queryParamsMap.Add("SignatureMethod", "HMAC-SHA1"); queryParamsMap.Add("SignatureVersion", "1.0"); queryParamsMap.Add("SignatureNonce", GetUniqueNonce()); string queryString = CanonicalizedQuery(queryParamsMap); string method = "GET"; string urlPath = "/"; string stringToSign = CreateStringToSign(method, urlPath, queryString); string signature = Sign(stringToSign, accessKeySecret + "&"); string queryStringWithSign = "Signature=" + signature + "&" + queryString; var url = "http://nls-meta.cn-shanghai.aliyuncs.com/?" + queryStringWithSign; var client = new HttpClient(); var response = await client.GetAsync(url); var json = await response.Content.ReadAsStringAsync(); response.Dispose(); client.Dispose(); return json; } private static string GetISO8601Time() { return DateTimeOffset.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ"); } private static string GetUniqueNonce() { return Guid.NewGuid().ToString(); } private static string PercentEncode(string value) { return Uri.EscapeDataString(value); } private static string CanonicalizedQuery(Dictionary<string, string> queryParamsMap) { var sortedKeys = queryParamsMap.Keys.Order(); var canonicalizedQueryString = new StringBuilder(); foreach (var key in sortedKeys) { canonicalizedQueryString .Append('&') .Append(PercentEncode(key)) .Append('=') .Append(PercentEncode(queryParamsMap[key])); } return canonicalizedQueryString.ToString().Substring(1); } private static string CreateStringToSign(string method, string urlPath, string queryString) { var strBuilderSign = new StringBuilder(); strBuilderSign.Append(method); strBuilderSign.Append('&'); strBuilderSign.Append(PercentEncode(urlPath)); strBuilderSign.Append('&'); strBuilderSign.Append(PercentEncode(queryString)); return strBuilderSign.ToString(); } private static string Sign(string stringToSign, string accessKeySecret) { var key = Encoding.UTF8.GetBytes(accessKeySecret); var source = Encoding.UTF8.GetBytes(stringToSign); var signData = HMACSHA1.HashData(key, source); var signBase64 = Convert.ToBase64String(signData); var signUrlEncode = PercentEncode(signBase64); return signUrlEncode; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结