因为需要天翼云的《智能视图服务》,所以看了相关开发文档,把我给恶心坏了
以下问题仅仅是针对《智能视图服务》
第一点和第二点只要其中任何一个满足我都不会吐槽,关键是这俩都没有!!
第三点:各位可以去文档地址看看,https://www.ctyun.cn/document/10011391/10040115 这里面提到的“传进来的 body 参数进行 sha256 摘要,对摘要出来的结果转十六进制”,不知道这个 body 是什么东西?而相关 api 的请求方式都是 GET 请求,所以更不知道这个 body 是什么鬼了,还有最重要的,里面提到的几次 hash 摘要和 hex 没有一句话是告诉开发者应该是大写还是小写,纯纯的恶心人!
然后我尝试根据文档的指示写了请求代码,无一例外,签名验证错误。。。
还有一个恶心点,在获取 AK 的时候,有一个 API 密钥和 OpenAPI 密钥,这俩只有 OpenAPI 密钥才能用于接口调用鉴权,不知道搞这么多密钥干什么。。。。
第四点,我直接提工单了。。
说真的,对比其他几家云商,就如同从大城市走进一个穷乡僻壤的地方,基础建设太差了,我觉得提供的服务可以少点,至少这些基础的文档建设还是要完善吧?
参考代码:(用了 Flurl.Http 库)
using Flurl.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace CTYunHelper
{
public class Vss
{
const string API = "https://vss-dsp-gzgy2-a.ctapi.ctyun.cn/v1";
const string AccessKeyId = "xxx";
const string SecretAccessKey = "xxxx";
public static async void Client()
{
Dictionary<string, string> _params = new Dictionary<string, string>
{
{ "Action", "DescribeVSSGroups" }
};
string eop_date = DateTime.Now.ToString("yyyyMMdd'T'HHmmss'Z'");
string request_id = Guid.NewGuid().ToString();
var request = API.WithHeader("eop-date", eop_date).WithHeader("ctyun-eop-request-id", request_id);
Dictionary<string, string> q2 = _params.OrderBy(t => t.Key).ToDictionary(t => t.Key, t => t.Value);
foreach( KeyValuePair<string, string> item in q2)
{
request.SetQueryParam(item.Key, item.Value);
}
string query = request.Url.Query;
string queryHash = CalcSHA256(query);
string queryHex = ToHex(queryHash);
string sigture = $"ctyun-eop-request-id:{request_id}\neop-date:{eop_date}\n\n{query}\n{queryHash}";
string kTime = HmacSHA256(eop_date, SecretAccessKey);
string kAk = HmacSHA256(AccessKeyId, kTime);
string kdate = HmacSHA256(eop_date, kAk);
string signature = HmacSHA256(sigture, kdate);
signature = Convert.ToBase64String(Encoding.UTF8.GetBytes(signature));
request.WithHeader("Eop-Authorization", $"{AccessKeyId} Headers=ctyun-eop-request-id;eop-date Signature={signature}");
try
{
var a = await request.GetAsync();
}
catch(FlurlHttpException ex)
{
string s = await ex.GetResponseStringAsync();
Console.WriteLine(s);
}
}
public static string CalcSHA256(string s)
{
SHA256 sha = SHA256.Create();
byte[] hash_bytes = sha.ComputeHash(Encoding.UTF8.GetBytes(s));
sha.Dispose();
return BitConverter.ToString(hash_bytes).Replace("-", "").ToLower();
}
public static string ToHex(string s)
{
return Convert.ToHexString(Encoding.UTF8.GetBytes(s)).ToLower();
}
public static string HmacSHA256(string s, string key)
{
HMACSHA256 hMACSHA256 = new HMACSHA256();
hMACSHA256.Key = Encoding.UTF8.GetBytes(key);
byte[] hash_bytes = hMACSHA256.ComputeHash(Encoding.UTF8.GetBytes(s));
hMACSHA256.Dispose();
return BitConverter.ToString(hash_bytes).Replace("-", "").ToLower();
}
}
}
Datetime:2023-04-28 00:09
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.