You need to enable JavaScript to run this app.
导航
签名方法
最近更新时间:2023.12.13 16:13:01首次发布时间:2021.07.16 22:21:54

为保证 OpenAPI 的安全调用,在调用 OpenAPI 时,火山引擎会对每个 OpenAPI 请求通过签名进行身份验证。

签名 SDK

RTC 提供了多种语言的签名 SDK,你可以直接调用进行签名,也可以参考签名 SDK 实现自己的 OpenAPI。

开发语言签名 SDK
Golang SDKvolc-sdk-golang
Java SDKvolc-sdk-java
Python SDKvolc-sdk-python
Nodejs SDKvolc-sdk-nodejs
PHP SDKvolc-sdk-php

OpenAPI签名示例

如果你希望自己构建签名,具体算法说明可参看如何计算签名。RTC 以 GetRecordTask 接口为例提供签名示例,帮助了解签名的全过程。
示例中 Access KeySecret Access Key 不具备权限,仅作 demo 示范,实际请求请使用真实创建的 Access KeySecret Access Key

Access Key ID:
AKLTMjI2ODVlYzI3ZGY1NGU4ZjhjYWRjMTlmNTM5OTZkYzE
Secret Access Key:
TnpCak5XWXpZV1U0WkRaaE5ERmxaR0ZpTmpjeVkyUXlZek0wTWpJMU1qWQ==

GetRecordTask 接口的请求参数如下:

参数名类型必填示例值描述
ActionStringGetRecordTask接口名称,本接口取值:GetRecordTask
VersionString2022-06-01接口版本,本接口取值:2022-06-01
AppIdStringYour_AppId你的音视频应用的唯一标志
RoomIdStringYour_RoomId房间的 ID,是房间的唯一标志
TaskIdStringYour_TaskId要查询的云端录制任务 ID。

因此原始请求为:

GET https://rtc.volcengineapi.com?Action=GetRecordTask&Version=2022-06-01&AppId=Your_AppId&RoomId=Your_RoomId&TaskId=Your_TaskId HTTP/1.1
Host: rtc.volcengineapi.com
Content-Type: application/x-www-form-urlencoded; charset=utf-8
X-Content-Sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
X-Date:20201230T081805Z

各字段具体解释参看公共请求参数

签名过程如下:

步骤1:创建规范请求

规范请求如下

CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload))

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

HTTPRequestMethod

GET

CanonicalURI

/

CanonicalQueryString

Action=GetRecordTask&AppId=Your_AppId&RoomId=Your_RoomId&TaskId=Your_TaskId&Version=2022-06-01

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

content-type:application/x-www-form-urlencoded; charset=utf-8
host:rtc.volcengineapi.com
x-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-date:20201230T081805Z
// 多一个换行

SignedHeaders

content-type;host;x-content-sha256;x-date

HexEncode(Hash(RequestPayload))

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

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

最终CanonicalRequest

GET
/
Action=GetRecordTask&AppId=Your_AppId&RoomId=Your_RoomId&TaskId=Your_TaskId&Version=2022-06-01
content-type:application/x-www-form-urlencoded; charset=utf-8
host:rtc.volcengineapi.com
x-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-date:20201230T081805Z


content-type;host;x-content-sha256;x-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

步骤2:创建待签字符串

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

Algorithm
目前是一个固定的字符串

HMAC-SHA256

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

20201230T081805Z

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

20201230/cn-north-1/rtc/request

HexEncode(Hash(CanonicalRequest))

cd2e2d1e141de6f5af872f4a5976268cf3757ce45a102ded8e0d8483e5435dfc

最终StringToSign

HMAC-SHA256
20201230T081805Z
20201230/cn-north-1/rtc/request
cd2e2d1e141de6f5af872f4a5976268cf3757ce45a102ded8e0d8483e5435dfc

步骤3:构建签名

HMAC这里代指HMAC-SHA256

Signingkey示例

在计算签名前,首先从私有访问密钥(Secret Access Key)派生出签名密钥(signing key),而不是直接使用私有访问密钥。

Signingkey=HMAC(HMAC(HMAC(HMAC("Your Secret Access Key","20201230"),"cn-north-1"),"rtc"),"request")

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

bc0e4f44b530f4db214d8c22d2e520eeb264b5e68906b039fb97e6880b4badf4

Signature示例

signature = HexEncode(HMAC(Signingkey, StringToSign))

最终的结果如下:

b650bac39169258e864c755c583327377aa505c8588f873bd7b3c5a08584942d

步骤4:将签名添加到请求当中

在请求中增加Authorization的header如下:

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

完整结果如下:

HMAC-SHA256 Credential=AKLTMjI2ODVlYzI3ZGY1NGU4ZjhjYWRjMTlmNTM5OTZkYzE/20201230/cn-north-1/rtc/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=b650bac39169258e864c755c583327377aa505c8588f873bd7b3c5a08584942d