V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lieyan
V2EX  ›  程序员

天翼云的 API 对接可能是我目前对接的云商里面最恶心的一个了

  •  
  •   lieyan · 2023-04-28 00:09:40 +08:00 · 2294 次点击
    这是一个创建于 578 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为需要天翼云的《智能视图服务》,所以看了相关开发文档,把我给恶心坏了

    以下问题仅仅是针对《智能视图服务》

    1. 没有相关 SDK 可用
    2. api 文档没有相关代码调用示例
    3. 接口鉴权文档乱起八糟,应该是从其他服务里面复制过来的
    4. 客服不行,问啥都不知道,转技术客服之后叫我提工单-.-!!

    第一点和第二点只要其中任何一个满足我都不会吐槽,关键是这俩都没有!!

    第三点:各位可以去文档地址看看,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

    第 1 条附言  ·  2023-04-28 11:47:27 +08:00
    后续

    官方给了新的文档地址和 demo

    https://vaas.ctyun.cn/document/api/

    真的好无语。。。。
    9 条回复    2023-11-17 21:45:12 +08:00
    dayeye2006199
        1
    dayeye2006199  
       2023-04-28 00:19:36 +08:00 via Android   ❤️ 1
    因为这类服务的常规用法:你是个甲方的爹爹,找到天翼的人或者外包,让他们搞定。
    BugCry
        2
    BugCry  
       2023-04-28 11:18:30 +08:00
    别用天翼云提供的任何 PaaS 、SaaS 服务
    都是外包的,东西上线就再没人管了
    利益相关:前天翼云公司员工
    lieyan
        3
    lieyan  
    OP
       2023-04-28 11:24:07 +08:00
    @BugCry 没办法,我的甲方要求使用他们的服务
    iocntop
        4
    iocntop  
       2023-04-28 12:08:15 +08:00
    @BugCry #2 这个话说的太真实了. --> 都是外包的,东西上线就再没人管了
    BugCry
        5
    BugCry  
       2023-04-28 13:58:21 +08:00 via Android
    @lieyan 找领导投诉,比提工单啥的都好使
    bogun
        6
    bogun  
       2023-04-28 14:19:33 +08:00
    嘿嘿,认证鉴权是他们做的比较好的了已经,等你深入去对接的时候,就会体会到什么叫真正的痛苦
    Aiurvia
        7
    Aiurvia  
       2023-04-28 21:06:21 +08:00
    这个都是外包的,并且外包的比较烂。
    烂到什么程度呢,就是外包的发包的、接包的可能都不懂。
    zzl22100048
        8
    zzl22100048  
       2023-04-28 22:20:00 +08:00 via iPhone
    天翼云最蠢的是他那个网络控制,达到带宽后直接丢包,监控图表与限流完全不一致,还好 1m 的机器也有 200m 下载,ghcr 等仓库自带镜像
    oldstudyman
        9
    oldstudyman  
       2023-11-17 21:45:12 +08:00
    鉴权是因为要兼容他们过去老系统的垃圾,所以只能继续垃圾下去。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1379 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:50 · PVG 07:50 · LAX 15:50 · JFK 18:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.