• Golang 实现华为云 DMS 签名


    构造请求

    首先构造请求,也就是要对哪个具体接口进行访问,需要提供什么必要的参数。在构造请求(点击查看中可以看到,对 DMS 服务来说必要的请求构成包括以下部分

    • 请求URI,例如 https://dms.cn-north-1.myhuaweicloud.com/v1.0/{project_id}/queues/{quque_id}(不同区域的Region部分不同)
    • 请求方法,如 "GET"、"POST"
    • 请求消息头,必选的是 "Content-Type",规定了消息体的格式,默认取值 "application/json",即消息体 "Body" 以 Json 格式提交
    • 请求消息体,有的接口需要,有的接口不需要

    准备参数

    以接口查看指定队列(点击查看)为例

    • 请求URI:https://dms.cn-north-1.myhuaweicloud.com/v1.0/{project_id}/queues/{quque_id}
    • 请求方法:"GET"
    • 请求消息体:无
    • project_id:项目ID,去统一身份认证的项目中根据区域不同查找
    • queue_id:要访问的队列ID,去控制台点开该队列查看
    • AK/SK:秘钥对,在统一身份认证内的用户的安全设置功能中管理,是生成签名的必需参数

    计算签名

    以AK/SK签名认证算法详解(点击查看)为标准,编写算法或使用 SDK,本例中使用的是官方提供的 SDK,调用步骤如下(点击查看

    生成 HTTP 请求

    以 AK=ABCDE....WYZ 和 SK=123...890为例,使用 SDK 生成签名

    /*
    查看指定队列
    */
    url := "https://dms.cn-north-1.myhuaweicloud.com/v1.0/506d66e5/queues/bc8e-86-42-8c-4d2"
    r, err := http.NewRequest(
        "GET",
        url,
        ioutil.NopCloser(bytes.NewBuffer([]byte(""))))
    /*
    添加必要的 Content-Type 头
    */
    r.Header.Add("content-type", "application/json")
    /*
    创建签名对象并签名
    */
    s := sign.Signer{ Key:conf.AK, Secret:conf.SK}
    s.Sign(r)
    

    s.Sign(r) 方法将两个请求头添加到了 r.Headers 中,一个是 X-Sdk-Date 其值是时间戳,另一个是 Authorization 其值是经过规定方式计算并拼接的一串字符串,如果将 r.Headers 打印出来就是

    map[Authorization:[SDK-HMAC-SHA256 Access=ABCDE....WYZ, SignedHeaders=content-type;x-sdk-date, Signature=0e9d22d370b3b34b6108998c3ced1d99cdb6d813aa41b5efeb7828295bb8f7a8] Content-Type:[application/json] X-Sdk-Date:[20191105T083411Z]]
    

    所有参数均已齐备,整理一下本次请求的所有内容

    • 请求完整URI:https://dms.cn-north-1.myhuaweicloud.com/v1.0/506d66e5/queues/bc8e-86-42-8c-4d2
    • 请求头
      • Content-Type:application/json
      • X-Sdk-Date:20191105T083411Z
      • Authorization:SDK-HMAC-SHA256 Access=ABCDE....WYZ, SignedHeaders=content-type;x-sdk-date, Signature=0e9d22d370b3b34b6108998c3ced1d99cdb6d813aa41b5efeb7828295bb8f7a8
      • 请求体:该接口无请求体,即 http 协议的 body 为空

    使用 Postman 提交请求,响应正文如下

    {
        "id": "bcf28b8e-83e6-4432-870c-413e79e555d2",
        "name": "huawei-dms-queue-log-test",
        "description": "",
        "reservation": 4320,
        "created": 1559033038000,
        "queue_mode": "KAFKA_HA",
        "max_msg_size_byte": 524288,
        "produced_messages": 2,
        "eff_date": 1559033038000,
        "group_count": 1,
        "kafka_topic": "k-506dba42b0f146b9a6026653544f66e5-bcf28b8e-83e6-4432-870c-413e79e555d2"
    }
    

    签名比对

    以上信息有的经过了优化处理,屏蔽掉了可能的隐私信息,如何验证计算结果正确与否呢。当 URI=https://dms.cn-north-1.myhuaweicloud.com/v1.0/506dba42b0f146b9a6026653544f66e5/queues/bcf28b8e-83e6-4432-870c-413e79e555d2AK=ABCDE....WYZSK=123...890X-Sdk-Date=20191105T094500Z 时,签名结果如下即为正确

    Authorization:
    SDK-HMAC-SHA256 Access=ABCDE....WYZ, SignedHeaders=content-type;x-sdk-date, Signature=8e0cb2f284b44795eee578d3484217a929cc1d9347bc6445477322eff15f8743
    

    注意

    云服务中尤其是API调用可能涉及很多权限问题,要检查所有可能的权限是否打开,比如当前AK/SK对应的用户是否是IAM用户,该用户所在的用户组是否被授权了对DMS产品的访问。在本文编写前,就碰到了签名始终报错 402 的问题,在对IAM账号所在用户组赋予了相应的策略后访问正常,虽然不能100%确认是该原因。

  • 相关阅读:
    Mybatis查询select操作
    插入排序和它的进化希尔排序
    关于c头文件的使用的小记录
    Mybatis介绍
    spring tool suite开发环境搭建
    一个简单的jsp+servlet登录界面的总结
    纠正关于线程的错误理解
    表达式语言EL简单学习
    [BZOJ 1804] Flood
    [POJ 1739] Tony's Tour
  • 原文地址:https://www.cnblogs.com/cinlap/p/11800111.html
Copyright © 2020-2023  润新知