• 沒有找到結果。

3.4 AK/SK 签名认证方法详解

3.4.1 Header 中携带签名

"catalog": [ {

"endpoints": [ {

"region_id": "******", ...

当接口调用出错时,会返回错误码及错误信息说明,错误响应的Body体格式如下所 示。

{ "error_msg": "The format of message is error", "error_code": "AS.0001"

}

其中,error_code表示错误码,error_msg表示错误描述信息。

3.4 AK/SK 签名认证方法详解

3.4.1 Header 中携带签名

DIS的所有API接口都可以通过在header中携带签名方式来进行身份认证,也是最常用 的身份认证方式。

在Header中携带签名是指将通过HTTP消息中Authorization header头域携带签名信 息,消息头域的格式为:

Authorization: SDK-HMAC-SHA256 Credential=ak/CredentialScope, SignedHeaders=SignedHeaders, Signature=signature

请求签名前需要准备的参数

3-4 请求签名相关的参数

参数名 含义 示例

method 请求类型 POST

ak 用户ak DJZN5UEQSODCWJ7NG

OMC

sk 用户sk vRNwGMd92PlityIO3daD

seoS9hciL9xKSKkBiJ44 projectId 用户projectId d575b0b740e54221aeb9

a165653b103d region 服务所在region信息(cn-north-4表

示华北四)

-url 请求url https://dis.$

{region}.myhuaweicloud.

com:20004/v2/

d575b0b740e54221aeb9 a165653b103d/records/?

stream- name=test2&partition-id=0

content 请求体 {"stream_name":"test2","

records":

[{"data":"aGVsbG8gd29y bGQu","partition_id":"","

explicit_hash_key":"","par tition_key":"0"}]}

service 服务简写 dis

header http请求头(签名时请求头不是必须 的,可以在签名完成之后,再添加 自定义请求头; 如果在签名之前有请 求头,则签名过程中需要把所有请 求头放入签名计算过程)

-● Step1:在请求头列表中添加如下两个新的请求头

● Step2:计算请求体的SHA256值

● Step3:计算CanonicalRequest

● Step4:计算StringToSign

● Step5:计算SigningKey

● Step6:计算Signature

● Step7:生成签名信息到Request中 说明

Host URL中的域名地址和端口

信息,格式为

● 如URL为https://dis.$

{region}.myhuaweiclo ud.com/v2/...,则Host 的值为dis.$

{region}.myhuaweiclo ud.com

● 如URL为https://dis.$

{region}.myhuaweiclo ud.com:443/v2/...,则 Host的值为dis.$

{region}.myhuaweiclo ud.com

● 如URL为https://dis.$

{region}.myhuaweiclo ud.com:20004/v2/...,

则Host的值为dis.$

{region}.myhuaweiclo ud.com:20004

● 如URL为https://

114.115.204.40/

v2/...,则Host的值为 114.115.204.40

请求头名称 取值描述 示例

X-Sdk-Date 使用当前UTC时间(北京时

间-8小时)生成的字符串,

格式为yyyyMMddTHHmmssZ 其中yyyy为年,MM为 月,dd为天,T为固定字 符,HH为时(24小时制),

mm为分,ss为秒,Z为固 定字符

例如在北京时间

2018-11-01 16:16:30,生 成的X-Sdk-Date值为 20181101T081630Z

20181101T081630Z

根据样例生成的请求头列表为

Host: dis.${region}.myhuaweicloud.com X-Sdk-Date: 20181101T081630Z

计算请求体的 SHA256 值

String calculateContentHash=sha256(content) 计算请求体content的sha256值获得。

须知

如果没有请求体(即content为空),则calculateContentHash为固定值

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

根据样例:

{"stream_name":"test2","records":

[{"data":"aGVsbG8gd29ybGQu","partition_id":"","explicit_hash_key":"","partition_k ey":"0"}]},

计算的calculateContentHash结果为:

af22378806bf4e69f5f1667877906e6ead78080cd859b4988ea6714dba6d1e02

计算 CanonicalRequest

String CanonicalRequest = HTTPRequestMethod + '\n' +

3-6 构造 CanonicalRequest 所需参数说明

参数 描述 示例

HTTPRequestMethod http请求类型 POST CanonicalURI URL域名端口和参数之间

的资源路径。

须知资源路径若不以/结尾,则需 要在最后补充/

● 如URL为https://dis.$

{region}.myhuaweiclo

● 如URL为https://dis.$

{region}.myhuaweiclo

CanonicalQueryString URL中的所有查询参数根 据参数名称进行字典排序 之后拼接的字符串,格式 为

CanonicalQueryEntry0 +

"&" +

CanonicalQueryEntry1 + ...若没有参数,则此值为 空字符串。

说明每个CanonicalQueryEntry 的格式为UrlEncode(QueryName) + '=' +

参数 描述 示例 CanonicalHeaders 根据请求头名称不区分大

小写进行字典排序之后拼 接的字符串,格式为:

CanonicalHeadersEntry0 +CanonicalHeadersEntry1 + ...

说明

每个CanonicalHeadersEntry的 格式为Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n'(即 小写的请求头 + ':'

SignedHeaders 所有请求头名称转为小写 之后进行字典排序拼接的

calculateContentHash 即计算请求体的SHA256

值。 af22378806bf4e69f5f166 7877906e6ead78080cd8 59b4988ea6714dba6d1e 02

根据样例计算的CanonicalRequest结果为:(\n显示为换行)

POST/v2/d575b0b740e54221aeb9a165653b103d/records/

partition-id=0&stream-name=test2 host:dis.${region}.myhuaweicloud.com x-sdk-date:20181101T081630Z host;x-sdk-date

RequestDate + '\n' + CredentialScope + '\n' + HashedCanonicalRequest))

3-7 构造 StringToSing 所需参数说明

参数 描述 示例

Algorithm

加密算法,固定为SDK-HMAC-SHA256。 SDK-HMAC-SHA256 RequestDate X-Sdk-Date的值 20181101T081630Z CredentialScope 认证范围,格式为 date/

region/service/

terminationString

● data:X-Sdk-Date的日 期部分,即

yyyyMMdd。

● region:传入的region 值。

● service:服务名,请求 数据接入服务固定为 dis。

● terminationString为终 端标识,固定为 sdk_request。

20181101/${region}/dis/

sdk_request

HashedCanonicalRequest 参见计算

CanonicalRequest,计算

计算 SigningKey

SigningKey是通过HmacSHA256算法计算出来的字节数组,方法如下:

kSecret = Bytes("SDK"+sk)

kDate = HmacSHA256(kSecret, Date) kRegion = HmacSHA256(kDate, Region) kService = HmacSHA256(kRegion, Service)

SigningKey = HmacSHA256(kService, "sdk_request")

HmacSHA256算法以一个密钥key(格式为字节数组)和一个消息message(格式为字符 串)为输入,生成一个消息摘要(格式为字节数组)作为输出。由于HmacSHA256的结果 都是字节数组,为了直观表示每一步的结果,方便校验,如下示例都会将每步的范例 结果Result表示为16进制字符串形式,即HexEncode(Result),注意参与计算过程的仍 然是字节数组而不是它HexEncode之后的值。

3-8 构造 SigningKey 所需参数说明

参数 描述 示例(实际值经过

HexEncode后的结果) kSecret "SDK"+sk (即sk前增加

SDK三个字符)的字符串,

kDate 以kSecret为key,以 Date(X-Sdk-Date的日期

kRegion 以kDate为key,以 Region(即入参region)为

kService 以kRegion为key,以 Service(即入参service,

SigningKey 以kService为key,以固定 字符串"sdk_request"为

由于SigningKey只与sk, date, region, service有关。当这四个参数不变时,SigningKey的值都是 固定的。故为了提升性能,可以把SigningKey的结果缓存起来,重复使用。

Signature

以SigningKey为key,以StringToSign为message的HmacSHA256的结果(字节数组),

Authorization: SDK-HMAC-SHA256 Credential=ak/CredentialScope, SignedHeaders=SignedHeaders, Signature=signature

● ak,即用户ak。

样例:DJZN5UEQSODCWJ7NGOMC

● CredentialScope,即计算StringToSign中用到的认证范围。

样例:20181101/${region}/dis/sdk_request

● SignedHeaders,即计算CanonicalRequest中用到的SignedHeaders。

样例:host;x-sdk-date

● signature,即计算Signature中得出的signature。

样例:8df520f285a18b7b101fc0d6507de03c4078460c65baa289ffa49ca718e9190b 根据样例计算的签名请求头为

Authorization: SDK-HMAC-SHA256 Credential=DJZN5UEQSODCWJ7NGOMC/20181101/${region}/dis/

sdk_request, SignedHeaders=host;x-sdk-date,

Signature=8df520f285a18b7b101fc0d6507de03c4078460c65baa289ffa49ca718e9190b

问题分析

● 如果签名正确,但是AK或者ProjectId不存在,服务端返回:

441 : Invalid AccessKey header. [Invaild ak.]

解决方法:

参见AK/SK认证的方法,确保AK正确。

参见获取项目ID的方法,确保ProjectId正确。

● 如果签名逻辑或者Sk错误,则服务端返回:

441 : Invalid authorization request.

解决方法:

使用示例参数验证签名流程,与示例结果比对,确保签名过程无误。

● 如果Region错误(例如使用华北区1的${region},却请求华南区的DIS地址),则服 务端返回:

441 : Invalid Region header. [${region}]

解决方法:

参见获取项目ID的方法,确保Region与DIS地址一一对应。

● 如果X-Sdk-Date的时间落后标准时间15分钟以上,则服务端会返回:

441 : Invalid X-Sdk-Date header

解决方法:

调整客户端时间为对应时区的标准时间即可。

4 应用示例

操作场景

数据接入服务面向实时数据,提供高效采集、传输、分发能力,提供丰富的接口,帮 助您快速构建实时数据应用。

下面介绍如何调用创建通道API创建数据接入通道,API的调用方法请参见如何调用 API。

说明

通过IAM服务获取到的Token有效期为24小时,需要使用同一个Token鉴权时,可以先将Token 缓存,避免频繁调用。

涉及 API

当您使用Token认证方式完成认证鉴权时,需要获取用户Token并在调用接口时增加

“X-Auth-Token”到业务接口请求消息头中。

● IAM获取token的API

● DIS创建通道的API

前提条件

您需要规划数据接入服务所在的区域信息,并根据区域确定调用API的Endpoint。

终端节点(Endpoint)即调用API的请求地址,不同服务不同区域的终端节点不同。

Endpoint您可以从终端节点及区域说明获取。

创建通道

如下示例是创建通道最简单的配置。

1. Token认证,具体操作请参考Token认证。

2. 发送“POST https://dis的Endpoint/v2/{project_id}/streams”。

3. 在Request Header中增加“X-Auth-Token”。

"stream_type": "COMMON",

"data_duration": 24 }

– stream_name:通道的名称,由您自行定义,例如取名为newstream。

– partition_count:分区是DIS数据通道的基本吞吐量单位,您可以根据业务吞 吐的需求选择通道的分区数。

– stream_type:通道类型,“COMMON”表示普通分区,单分区支持最大 1MB/s的写入速度和2MB/s的读取速度。

– data_duration:通道生命周期,即通道分区中数据的保留时长。

请求响应成功后,返回201 Created,表示通道创建成功。

若请求失败,则会返回错误码及对应的错误信息说明,详细错误码信息请参考错 误码。

创建支持自动扩缩容的通道

您还可以创建支持自动扩缩容的通道,可以根据通道的流量情况自动为您扩充或缩减 分片数量。示例如下。

1. Token认证,具体操作请参考Token认证。

2. 发送“POST https://dis的Endpoint/v2/{project_id}/streams”。

3. 在Request Header中增加“X-Auth-Token”。

4. 在Request Body中传入参数如下:

{"stream_name": "dis-DLpR",

"partition_count": 1,

"stream_type": "COMMON",

"data_duration": 24

"auto_scale_enabled": true,

"auto_scale_min_partition_count": 2,

"auto_scale_max_partition_count": 10 }

这个示例中创建了支持自动扩缩容的通道,通道缩容的最小分区数量是2,扩容的 最大分区数量是10,也就是说如果通道10个分区后不会再触发自动扩容。

– auto_scale_enabled:是否开启自动扩缩容,true表示开启。

– auto_scale_min_partition_count:当自动扩缩容启用时,自动缩容的最小分 片数,比如这个示例中当分区数量为2时,不会再触发自动缩容。

– auto_scale_max_partition_count:当自动扩缩容启用时,自动扩容的最大分 片数,比如这个示例中当分区数量为10时,不会再触发自动扩容。

请求响应成功后,返回201 Created,表示通道创建成功。

若请求失败,则会返回错误码及对应的错误信息说明,详细错误码信息请参考错 误码。

创建带数据 Schema 的通道

您还可以为通道配置Schema,在使用DIS转储到其它服务时,可以根据通道配置的 Schema来完成映射,示例如下。

1. Token认证,具体操作请参考Token认证。

2. 发送“POST https://dis的Endpoint/v2/{project_id}/streams”。

3. 在Request Header中增加“X-Auth-Token”。

4. 在Request Body中传入参数如下:

{"stream_name": "dis-DLpR",

"partition_count": 1,

"stream_type": "COMMON",

"data_duration": 24

"auto_scale_enabled": true,

"auto_scale_min_partition_count": 1,

"auto_scale_max_partition_count": 10

"data_type": "JSON",

"data_schema":

"{\"type\":\"record\",\"name\":\"RecordName\",\"fields\":[{\"name\":\"key1\",\"type\":\"string

\"},{\"name\":\"key2\",\"type\":\"string\"}]}"

}

这个示例中创建了一个源数据类型为JSON,且数据包含“key1”、“key2”这两 个属性的通道。

– data_type:指定源数据的类型,“JSON”表示分区中的数据格式为JSON格 式。

– data_schema:源数据Schema,用于描述JSON、CSV格式的源数据结构,采 用Avro Schema的语法描述。

请求响应成功后,返回201 Created,表示通道创建成功。

若请求失败,则会返回错误码及对应的错误信息说明,详细错误码信息请参考错 误码。

5 API 说明

5.1 通道管理

5.1.1 创建通道

功能介绍

本接口用于创建通道。

● 创建通道时,需指定通道类型(普通、高级)、分区数量。

● 一个账号账号默认最多可以创建10个高级通道分区和50个普通通道分区,可提交 工单增加配额。

调试

您可以在API Explorer中调试该接口。

URI

POST /v2/{project_id}/streams

5-1 路径参数

参数 是否必选 参数类型 描述

project_id 是 String 项目ID。

请求参数

5-2 请求 Header 参数

参数 是否必选 参数类型 描述

X-Auth-Token 是 String 用户Token。

通过调用IAM服务获取用户 Token接口获取(响应消息头中 X-Subject-Token的值)。

5-3 请求 Body 参数

参数 是否必选 参数类型 描述

stream_name 是 String 通道名称。

通道名称由字母、数字、下划线 和中划线组成,长度为1~64字 符。

最大长度:64 partition_cou

nt 是 Integer 分区数量。

分区是DIS数据通道的基本吞吐 量单位。

stream_type 否 String 通道类型。

● COMMON:普通通道,表 示1MB带宽。

● ADVANCED:高级通道,表 示5MB带宽。

枚举值:

● COMMON

● ADVANCED

参数 是否必选 参数类型 描述

data_type 否 String 源数据类型。

● BLOB:存储在数据库管理系

data_duration 否 Integer 数据保留时长。

取值范围:24~72。

abled 否 Boolean 是否开启自动扩缩容。

● true:开启自动扩缩容。

data_schema 否 String 用于描述用户JSON、CSV格式

data_schema 否 String 用于描述用户JSON、CSV格式