更新时间:2023-02-06 15:35:17
对于每个请求,Cloud VoD 都会通过请求中的 Authorization Header 来验证身份。
本节我们将以从云点播中获取视频列表为例,一步一步地向大家展示如何编写Authorization Header。
获取视频列表的网址为:
https://api.cloudv.haplat.net/vod/videoManage/getVideoList
Authorization 由 Algorithm、AccessKey Secret、SignedHeaders 和 Signature 组成。 Algorithm 是 WS3-HMAC-SHA256 的固定值,因此 Authorization 如下所示:
Authorization:WS3-HMAC-SHA256
Credential=<AccessKeyId >/<Date>/<Region>/<Service>/wos_request,
SignedHeaders=<SignedHeader>;<SignedHeader>;<SignedHeader>,
Signature=<Signature>
整体计算过程如下:
将请求的内容(主机、操作、标头等)安排为标准(规范)格式。规范请求是用于创建要签名的字符串的输入之一。
创建一个字符串以使用规范请求和额外信息(例如算法、请求日期、凭证范围和规范请求的摘要(哈希))进行签名。
在此步骤中,首先您必须通过对请求日期、区域和服务执行一系列键控哈希操作(HMAC 操作)来派生签名密钥,并将您的秘密访问密钥作为初始哈希操作的密钥。</ br>
推导出签名密钥后,您可以通过对要签名的字符串执行键控哈希操作来计算签名。使用派生的签名密钥作为此操作的哈希密钥。
要开始签名过程,您必须创建一个字符串,其中包含来自您的请求的标准化(规范)格式的信息。这样可以保证当Cloud VoD收到请求时,服务端可以计算出和你计算出的相同的签名。
您应该按照以下格式创建规范请求:
<HTTPMethod> + "\n" + <RequestURI> + "\n" + <QueryString> + "\n" + <CanonicalHeaders> + "\n" + <SignedHeaders> + "\n" + <HashedPayload>
在规范请求中:
字段 | 描述 |
---|---|
HTTPMethod | HTTP 方法之一,例如 GET 和 POST。在示例请求中,我们使用 POST 方法。 |
RequestURI | 请求的 URI。获取视频列表接口,URI为/vod/videoManage/getVideoList。 |
QueryString | 请求 URL 中的查询字符串参数。对于POST请求,QueryString是一个空字符串“”。对于GET请求,QueryString是“?”后面的字符串。在请求网址中。例如,videoName=testVideoName&pageIndex=2&pageSize=5。 * |
CanonicalHeaders | 将用于计算签名的 Headers 的键和值。您应该至少在 CanonicalHeaders 中包含 Headers host和content-type 。还允许在 CanonicalHeaders 中添加自定义标头以进行更好的身份验证。 注意事项:1。所有大写字母都需要转换为小写字母并去除第一个和最后一个空格。然后以key:value\n的格式组装key和value。2.如果 CanonicalHeaders 中包含多个 Header,则 Headers 的所有键和值都应按 Header 键(小写)的 ASCII 顺序排序。* |
SignedHeaders | ASCII 升序排序、分号分隔的小写请求标头名称列表。列出的标头必须与 CanonicalHeaders 中列出的标头相同。 例如,在上面的 CanonicalHeaders 示例中,SignedHeaders 应该是: content-type;host |
HashedRequestPayload | 请求负载的 SHA256 哈希值的十六进制值。 例如当请求的内容类型为:application/json时,HashedRequstPayload为: Lowercase Lowercase(HexEncode(Hash.SHA256({"videoName":"a","pageSize":"5","pageIndex":"2"}))) 当请求if为content-type:application/x-www-form-urlencoded时,HashedRequestPayload为: Lowercase Lowercase(HexEncode(Hash.SHA256("videoName=a&pageIndex=2&pageSize=5"))) 注意: **Lowercase(HexEncode(Hash.SHA256(RequestPayload)))**是一个伪代码,用于计算请求负载的HASH,然后编码为十六进制并转换为小写。 对于GET请求,HashedRequestPayload是空字符串的散列,散列返回如下值: 135b13e1b15e3c836eab2ab9196a86e7bcdb7b68da27215175a65b89ade3587e |
对于这个例子,CanonicalRequest 是:
POST
/vod/videoManage/getVideoList
content-type:application/json; charset=utf-8
host:api.cloudv.haplat.net
content-type;host
641f7989f8d223af8c5049f805890fcaf2ae4a99780a01eb454cf7c9368dd1a4
要签名的字符串包含有关您的请求和您在任务 1 中创建的规范请求的元信息:为 Signature 创建规范请求。您将使用要签名的字符串和稍后创建的派生签名密钥作为输入来计算任务 3 中的请求签名:计算签名。
要签名的字符串是以下字符串的串联:
StringToSign = Algorithm + \n + Timestamp + \n + HashedCanonicalRequest
字段 | 描述 |
---|---|
Algorithm | 您正在使用的哈希算法,目前固定为“WS3-HMAC-SHA256”。 |
Timestamp | 以秒为单位的时间戳,它与您在请求标头 X-WS-Timestamp 中使用的值相匹配。对于此示例,该值为 1564645579。 |
HashedCanonicalRequest | 您在**任务 1:创建规范请求中创建的 CanonicalRequest 的哈希值,在此示例中,它是16bc1b4d4e6818f5aec2a7273cb2c3d3e4831fd61c6510222b9bec19bffac646 . |
注意:需要保证时间戳和标准时间同步,否则时间差超过五分钟会失败。如果你的系统长时间没有与标准时间同步,可能会因为时间戳过期导致请求失败,返回签名过期错误。
对于我们所采用的例子中,StringToSign 是:
WS3-HMAC-SHA256
1564645579
16bc1b4d4e6818f5aec2a7273cb2c3d3e4831fd61c6510222b9bec19bffac646
签名是任务 2 中要签名的字符串的 HMAC-SHA256 哈希,使用您的 accessKey Secret 作为哈希编码的密钥。计算方法如下:
Signature = HMAC-SHA256(SigningKey, StringToSign)
注意:确保以正确的顺序为您使用的编程语言指定 HMAC 参数。此示例将密钥显示为第一个参数,将数据(消息)显示为第二个参数,但您使用的函数可能会以不同的顺序指定密钥和数据。*
授权是您应该放入请求标头中以进行身份验证的值。生成的授权可以按如下方式进行:
Authorization =
Algorithm + ' ' +
'Credential=' + AccessKey + ', ' +
'SignedHeaders=' + SignedHeaders + ', ' +
'Signature=' + Signature
字段 | 描述 |
---|---|
Algorithm | 您正在使用的哈希算法,目前固定为“WS3-HMAC-SHA256”。 |
AccessKey | 访问密钥 ID。您可以在控制台的安全设置>访问控制>用户信息管理> AccessKey管理下获取AccessKey ID。示例中AccessKey ID为AKIDz8krbsJ5yKBZQpn74WFkmLPx3示例. |
SignedHeaders | 在任务 1:创建规范请求中查看更多详细信息。在示例中,值为内容类型;主机. |
Signature | 您在任务 3 中创建的签名:计算签名。在示例中,签名值为72e494ea809ad7a8c8f7a4507b9bddcbaa8e581f516e8da2f66e2c5a96525168 . |
根据上面的信息,我们可以得到如下授权:
WS3-HMAC-SHA256 Credential=AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE, SignedHeaders=content-type;host, Signature=792dcb6d648a456a030c9c6683fa7bde2a31cb4c72cfeaa354da000adf7c288d
最终的请求是:
POST https://api.cloudv.haplat.net/ Authorization: WS3-HMAC-SHA256 Credential=AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE, SignedHeaders=content-type;host, Signature=792dcb6d648a456a030c9c6683fa7bde2a31cb4c72cfeaa354da000adf7c288d Content-Type: application/json; charset=utf-8 Host: api.cloudv.haplat.net X-WS-AccessKey: AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE X-WS-Timestamp: 1564645579 {"videoName":"a","pageSize":"5","pageIndex":"2"}
代码 | 描述 |
---|---|
4001 | 认证参数错误,请检查请求中是否携带了所有必填参数。 |
4002 | X-WS-AccessKey错误,请检查请求中是否存在accesskey。 |
4003 | X-WS-Timestamp 不正确,时间戳应该是秒级。 |
4004 | X-WS-Timestamp 到期。 |
4005 | 主机参数不正确。 |
4006 | 内容类型不正确。 |
4007 | 认证失败,请检查参数是否正确。 |
4008 | 认证失败。失败可能由以下原因引起:- 签名不正确。- 签名与请求中实际发送的签名不匹配。- AccessKey Secret 不正确。 |
4009 | 该授权已在另一个请求中使用,请创建另一个。 |
curl -X POST https://api.cloudv.haplat.net/vod/videoManage/getVideoList -H "Authorization: WS3-HMAC-SHA256 Credential=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, SignedHeaders=content-type;host, Signature=471d8f86cefa4fa2f929642207b6df8fe770e82e0df328f4f68af08c8b8a8029" -H "Content-Type: application/json; charset=utf-8" -H "Host: api.cloudv.haplat.net" -H "X-WS-Timestamp: 1564644606" -H "X-WS-AccessKey: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" -d '{"videoName": "a","pageIndex":"2","pageSize":"5"}'
curl -X POST https://api.cloudv.haplat.net/vod/videoManage/getVideoList
-H "Authorization: WS3-HMAC-SHA256 Credential=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, SignedHeaders=content-type;host, Signature=37ea1014de0c90e83e733f8d19a5d3ae993896d34450c9f8cf8df5642c81339e"
-H "Content-Type: application/x-www-form-urlencoded; charset=utf-8"
-H "Host: api.cloudv.haplat.net"
-H "X-WS-Timestamp: 1564644607"
-H "X-WS-AccessKey: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
-d 'videoName=a&pageIndex=2&pageSize=5'
curl -X GET https://api.cloudv.haplat.net/vod/videoManage/getVideoList?videoName=a&pageIndex=2&pageSize=5
-H "Authorization: WS3-HMAC-SHA256 Credential=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, SignedHeaders=content-type;host, Signature=0b489e43c5cd2e52cbe0768a68c614a4211210a6d63b18ff65cc986f18e75aac"
-H "Content-Type: application/x-www-form-urlencoded; charset=utf-8"
-H "Host: api.cloudv.haplat.net"
-H "X-WS-Timestamp: 1564644607"
-H "X-WS-AccessKey: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
对于 GET 请求,Content-Type 必须是 application/x-www-form-urlencoded。