构造请求

首先构造请求,也就是要对哪个具体接口进行访问,需要提供什么必要的参数。在构造请求(点击查看中可以看到,对 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%确认是该原因。

Golang 实现华为云 DMS 签名的更多相关文章

  1. 华为云kafka POC 踩坑记录

    2019/03/08 18:29 最近在进行华为云相关POC验证,个人主要负责华为云DMS kafka相关.大致数据流程是,从DIS取出数据,进行解析处理,然后放入kafka,再从kafka中取出数据 ...

  2. 华为云照片的爬虫程序更新(python3.6)

    一.背景: 每年终都有一个习惯,就是整理资料进行归档,结果发现手机照片全备份在华为云里,在官网上找了一圈,没找到官方的pc工具用来同步照片. 于是找出上次写的程序,看看能不能爬到数据,然而……果然不好 ...

  3. #PHP# 华为云 API 方式发送短信

    使用给华为云 消息 服务 API 方式发送短信 代码来自华为云,已通过测试 <?php /** * 华为云发送短信示例代码 * 本段代码需要使用自己的配置信息才能正常运行,出配置信息外,不需要改 ...

  4. 用Python调用华为云API接口发短信

    [摘要] 用Python调用华为云API接口实现发短信,当然能给调用发短信接口前提条件是通过企业实名认证,而且有一个通过审核的短信签名,话不多说,showcode #!/usr/bin/python3 ...

  5. 王晶:华为云OCR文字识别服务技术实践、底层框架及应用场景 | AI ProCon 2019

    演讲嘉宾 | 王晶(华为云人工智能高级算法工程师王晶) 出品 | AI科技大本营(ID:rgznai100) 近期,由 CSDN 主办的 2019 中国AI 开发者大会(AI ProCon 2019) ...

  6. golang对接阿里云私有Bucket上传图片、授权访问图片

    golang对接阿里云私有Bucket上传图片.授权访问图片 1.为什么要设置私有bucket 公共读写:互联网上任何用户都可以对该 Bucket 内的文件进行访问,并且向该 Bucket 写入数据. ...

  7. 华为云ubunbu部署.NetCore3.1项目(DDD商城)

    提前项目打包发布,文件传输工具Filezilla,注意是选择sftp协议,将publish文件传到/home文件夹下 第一步  .NetCoreSDK安装 微软官方的文档https://docs.mi ...

  8. 如何在华为云软件开发云上搭建JavaWeb,Maven项目

    本文将使用华为云软件开发云向大家演示如何搭建JavaWeb,Maven项目. 一.相关信息 1.华为云软件开发云简介 华为云软件开发云(DevCloud)是集华为近30年研发实践,前沿研发理念,先进研 ...

  9. golang实现文字云算法

    golang实现文字云算法 项目链接 https://github.com/bangbaoshi/wordcloud 效果图 测试步骤如下 git clone https://github.com/b ...

随机推荐

  1. Enum枚举的使用实现

    业务中涉及到的状态字段或者简单的选择项的使用. 例如: 1.定义enum枚举类. package com.yjl.enums; import java.util.Objects; public enu ...

  2. 【SQL server基础】手动创建数据库和表格

    use master go if exists(select * from sysdatabases where name='learning') drop database learning go ...

  3. Mysql高手系列 - 第18篇:mysql流程控制语句详解(高手进阶)

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第18篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...

  4. 【CSS】width和height计算

    width:calc(100% - 20px); width:-webkit-calc(100% - 20px);//chrome width:-moz-calc(100% - 20px);//fir ...

  5. Spring Security 动态url权限控制(三)

    一.前言 本篇文章将讲述Spring Security 动态分配url权限,未登录权限控制,登录过后根据登录用户角色授予访问url权限 基本环境 spring-boot 2.1.8 mybatis-p ...

  6. C# 添加、读取、删除Excel文档属性

    在文档属性中,可以设置诸多关于文档的信息,如创建时间.作者.单位.类别.关键词.备注等摘要信息以及一些自定义的文档属性.下面将通过C#程序来演示如何设置,同时对文档内的已有信息,也可以实现读取或删除等 ...

  7. badboy录制脚本

    第一步:介绍badboy工具 1.1: 页面功能分析: 1. 界面视图,模拟浏览器,能够进行操作 2. 需要录制脚本的URL 3. 点击运行URL 4. Summary:运行的各指标,响应时间,成功事 ...

  8. ElasticSearch安装SQL插件

    ElasticSearch安装SQL插件下载地址(中国大佬开发的,膜拜ing):https://github.com/NLPchina/elasticsearch-sql 1.记得选择和自己Elast ...

  9. PHP compact

    1.函数的作用:将变量转成数组 2.函数的参数: @params string $varname1 @params string $varname2 ... @params array $varnam ...

  10. PMP 项目管理第六版- 组织治理与项目治理之间的关系

    组织治理: 1.组织治理通过制定政策和流程,用结构化方式指明工作方向并进行控制,以便实现战略和运营目标. 2,组织治理通常由董事会执行,以确保对相关方的最终责任得以落实,并保持公平和透明. 项目治理: ...