You need to enable JavaScript to run this app.
导航
调用方式
最近更新时间:2024.07.11 17:45:44首次发布时间:2024.07.10 15:50:04

请求结构

OpenAPI的请求结构如下:
服务地址
参考 1.2.1 确认URL。
通信协议
支持通过 HTTP 或 HTTPS 两种方式进行请求通信,推荐使用安全性更高的 HTTPS方式发送请求。
请求方法
请求方法详见各个接口具体的需求。OpenAPI大多数支持GET或POST请求。
请求参数
OpenAPI请求包含两类参数:公共请求参数和接口请求参数。其中公共请求参数在每个请求中都必须包含。接口请求参数需参考各个服务的接口文档。
字符编码
请求及返回结果使用UTF-8的字符集进行编码。

公共参数

所有接口请求中都必须携带公共参数,为了避免重复说明,产品的API文档中可能不再重复描述这部分参数,请您在请求API时携带这部分参数,否则请求将无法通过合法性验证
公共参数如下:

  1. ApiAction 与 ApiVersion

说明

注: ApiAction 与 ApiVersion 必须放到 query 中

名称

类型

是否必填

参数格式

描述

示例值

ApiAction

String

[a-zA-Z]+

接口名称。实际调用时请参考您使用的产品的API文档取值

CreateUser

ApiVersion

String

YYYY-MM-DD

接口的版本。 实际调用时请参考您使用的产品的API文档取值。

2023-02-10

  1. 签名参数

说明

注:签名参数放在 header 中

名称

类型

是否必填

描述

示例值

X-Date

String

使用UTC时间,精确到秒,使用遵循ISO 8601标准的格式:YYYYMMDD'T'HHMMSS'Z'

20201103T104027Z

Authorization

String

HMAC-SHA256 Credential={AccessKeyId}/{ShortDate}/{Region}/{Service}/request, SignedHeaders={SignedHeaders}, Signature={Signature}

HMAC-SHA256 Credential=AKLTMjI2ODVlYzI3ZGY1NGU4ZjhjYWRjMTlmNTM5OTZkYzE/20201230/cn/open_platform/request, SignedHeaders=content-type;x-date, Signature=28eeabbbd726b87002e0fe58ad8c1c768e619b06e2646f35b6ad7ed029a6d8a7

Authorization中的信息含义:

名称

类型

备注

AccessKeyId

String

请求的Access Key ID。

ShortDate

String

请求的短时间,精确到日。使用UTC时间,请使用格式:YYYYMMDD, 例如:20180201

Region

String

请求的地域例如cn,当您使用的产品按Region提供服务时,该参数值请填写您实际要访问的Region。当使用非Region服务类产品,可以填写“cn”

Service

String

请求的服务,此处填写open_platform

SignedHeaders

String

参与签名的Header,多个Header间用分号分隔。目的是指明哪些header参与签名计算

Signature

String

计算完毕的签名。

签名机制

此处介绍上文签名参数的生成机制。具体为两个字段的生成机制即Credential和SignedHeaders,这两个字段合并成authorization。
几个简写:

Hash代指SHA256算法
HexEncode代指转16进制编码
Hmac指代Hmac_SHA256

  1. 创建一个正规化请求CanonicalRequest
CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload))

其中每个字段的含义如下:

  • HTTPRequestMethod:指代http请求的method,例如:GET、POST等。
  • CanonicalURI:指代正规化后的URI。如果URI为空,那么使用"/"作为绝对路径。在CDP中绝大多数接口的URI都为"/"。如果是复杂的path,请通过RFC3986规范进行编码。
  • CanonicalQueryString:指代正规化后的Query String。对于Query String的正规化大致的过程如下:
    • urlencode(注:同RFC3986方法)每一个querystring参数名称和参数值。
    • 按照ASCII字节顺序对参数名称严格排序,相同参数名的不同参数值需保持请求的原始顺序。
    • 将排序好的参数名称和参数值用=连接,按照排序结果将“参数对”用&连接。
    • 例如:
CanonicalQueryString = "ApiAction=ListUsers&ApiVersion=2018-01-01"
  • CanonicalHeaders:指代正规化后的Header,具体操作如下:
    • 将Header的名称全部转化成小写
    • 去掉Header的值的前后多余的空格
    • 用":"连接header的名称和值
    • 每个header占一行,拼接成一个String
  • SignedHeaders:指参与签名的header,和CanonicalHeaders包含的header是一一对应的,目的是指明哪些header参与签名计算,从而忽略请求被proxy添加的额外header,其中host、x-date如果存在header中则必选参与。具体操作如下:
    • 将上面CanonicalHeaders中的每一组header都转小写,用";"隔开,不换行了。
  • HexEncode(Hash(RequestPayload)):RequestPayload指完整的请求body,此处先对其计算SHA256,再转16进制编码
  1. 创建签名字符串StringToSign

签名字符串主要包含请求以及正规化请求的元数据信息,由签名算法、请求日期、信任状和正规化请求哈希值连接组成,伪代码如下:

StringToSign = Algorithm + '\n' + RequestDate + '\n' + CredentialScope + '\n' + HexEncode(Hash(CanonicalRequest))
  • Algorithm:指代签名的算法,目前CDP仅支持HMAC-SHA256的签名算法。
  • RequestDate:指代请求UTC时间,请使用如下格式:YYYYMMDD'T'HHMMSS'Z' 。
  • CredentialScope:指代信任状,格式为:YYYYMMDD/region/service/request。
  • CanonicalRequest:上面计算出的结果。
  1. 计算签名秘钥(signing-key)

在计算签名前,首先从私有访问密钥(secret Access Key)派生出签名密钥(signing key),而不是直接使用私有访问密钥。具体计算过程如下:

kSecret = *Your Secret Access Key*
kDate = HMAC(kSecret, Date)
kRegion = HMAC(kDate, Region)
kService = HMAC(kRegion, Service)
kSigning = HMAC(kService, "request")

其中Date精确到日,与RequestDate中YYYYMMDD部分相同。

  1. 计算签名
Signature = HexEncode(HMAC(kSigning, StringToSign))

然后构建header

Authorization: HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}

表达式中用{}括起来的代表上文计算出的中间过程。
ak/sk获取
私部环境

  • 进入CDP, 点击“项目中心”->"资产输出"->"渠道管理"->"自定义渠道", 点击“添加渠道应用”,配置访问的App 以及相应的账号

签名示例
图片
以这个调用为例:

AK:BDPPee313bdff6ef33555d6c5c1e7b8152aa
SK:75e089c0f77268a20f0ce78d97eea0f

GET https://e0-0-220cdp.datarangers-onpremise.volces.com/open_platform/openapi?ApiAction=ListUsers&ApiVersion=2023-02-10&Limit=10&Offset=0 HTTP/1.1
Host: e0-0-220cdp.datarangers-onpremise.volces.com
Content-Type: application/x-www-form-urlencoded; charset=utf-8
X-Content-Sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
X-Date:20201230T081805Z
说明:
header: X-Content-Sha256 表示对请求中的二进制的body进行SHA-256 哈希。
如果是Get请求,则对[]byte{} 进行sha256 哈希,哈希值是"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"

规范请求

CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload))
  • HTTPRequestMethod
GET
  • CanonicalURI
/open_platform/openapi
  • CanonicalQueryString
ApiAction=ListUser&ApiVersion=2023-02-10&Limit=10&Offset=0
  • CanonicalHeaders

将需要参与签名的header的key全部转成小写, 然后以ASCII排序后以key-value的方式组合后换行构建。

x-date:20230313T051101Z
// 多一个换行
  • SignedHeaders
x-date
  • HexEncode(Hash(RequestPayload))

无论是GET请求还是POST请求都有RequestPayload,其中此请求中的RequestPayload是空字符串。
这里的hash算法代指:sha256 []byte

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
  • 最终CanonicalRequest
GET
/open_platform/openapi
ApiAction=ListUser&ApiVersion=2023-02-10&Limit=10&Offset=0
x-date:20230313T051101Z

x-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

待签字符串

StringToSign = Algorithm + '\n' + RequestDate + '\n' + CredentialScope + '\n' + HexEncode(Hash(CanonicalRequest))
  • Algorithm

目前是一个固定的字符串

HMAC-SHA256
  • RequestDate

请求发起的时间, 与X-Date相同。

20230313T051101Z
  • CredentialScope

指代信任状,格式为:YYYYMMDD/region/service/request
此请求信息如下:

20230313/cn/open_platform/request
  • HexEncode(Hash(CanonicalRequest))
933cfa461d6630a796a773a9e3ef13489bdf12fe4ad1a99ee724634b2b6a9ee6
  • 最终StringToSign
HMAC-SHA256
20230313T051101Z
20230313/cn/open_platform/request
933cfa461d6630a796a773a9e3ef13489bdf12fe4ad1a99ee724634b2b6a9ee6

签名

HMAC这里代指HMAC-SHA256

  • Signingkey示例
HMAC(HMAC(HMAC(HMAC(kSecret,"20230313"),"cn"),"open_platform"),"request")

以下示例显示了此 HMAC 哈希操作序列生成的派生签名密钥。这说明了此二进制签名密钥中每个字节的十六进制表示形式。

b40d8e9b81c28d8494218b3c7ddb07155345ec33bf858b2026b6bb335eb6de58
  • Signature示例
signature = HexEncode(HMAC(Signingkey, StringToSign))

最终的结果如下:

c808c9fce0d830df36b957e8797fc58728c0209f41193d21f6e117d1b6932dc9

将签名添加到请求当中
在请求中增加Authorization的header如下:

Authorization: HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}

完整结果如下:

Authorization: HMAC-SHA256 Credential=BDPPee313bdff6ef33555d6c5c1e7b8152aa/20230313/cn/open_platform/request, SignedHeaders=x-date, Signature=c808c9fce0d830df36b957e8797fc58728c0209f41193d21f6e117d1b6932dc9

CDP 提供了Java, Golang语言的SDK, SDK的使用参见下文 6. SDK使用。

返回结构

返回通用Json 结构

名称

数据类型

描述

data

Object

返回数据内容

msg

String

请求出现错误,返回错误信息

code

Int

返回错误码(全局常用错误码表见公共错误码)

参数名称统一

说明

接口调用中 X-Tenant、tenantCode、tenantId、appId、projectId 均为项目ID,代表相同含义,仅参数名称不同,获取方式见附录中的租户code获取方式。