附录5:上传与删除请求的授权签名

上传与删除请求的授权签名通过HTTP的身份验证标头传递给后台服务器进行校验。

<blockquote>
该方式使用Athorization头部字段传递签名数据,并放置于各HTTP请求的报文头中,如下图所示,身份验证标头具有以下形式:
 
<HTML><blockquote>
<code>
Authorization: AutoAI AutoAIPublicKey:Signature
</code></blockquote>

其中,Signature是一个哈希值,具体为请求中特定元素的HMAC-SHA1(RFC2104),因此Signature会因请求不同而异。如果客户端请求中随附的Signature与服务端计算出的Signature相匹配,则证明请求者拥有AutoAI允许的访问权限。以下是Authorization身份验证标头构造的伪代码

<blockquote>
<code>
Authorization = "AutoAI" + " " + AutoAIPublicKey + ":" + Signature
Signature = Base64( HMAC-SHA1( AutoAIPrivateKey, UTF-8-Encoding-Of( StringToSign ) ) )
StringToSign = HTTP-Verb + "\n" +
    Content-MD5 + "\n" +
    Content-Type + "\n" +
    Date + "\n" +
    CanonicalizedAutoAIHeaders +
    CanonicalizedResource
CanonicalizedAutoAIHeaders = 
CanonicalizedResource = "/" + Bucket + "/" + Key
</code></blockquote>

StringToSign中包括两类标头元素:

<blockquote>
一类是位置标头,仅有3个,分别是Content-MD5、Content-Type和Date,在StringToSign中不包括这些标头的名称,仅包括它们在请求中的值,如果请求中这些标头不存在,需要用空字符串("")代替;
 
另一类是AutoAI附加标头,以“X-AutoAI-”开头,此类标头需要按照下面指定的方法构造CanonicalizedAutoAIHeaders字符串后加入到StringToSign中。
 
<HTML><blockquote>
> **note**
 
<HTML><ol style="list-style-type: lower-alpha;">
<li>

如果位置标头不在请求中(例如,Content-Type或Content-MD5对于PUT请求是可选的,并且对于GET请求没有任何意义),必须使用空字符串""替换该位置;

</li>
<li>

BASE64使用standardbase64,不是URLSafe的base64算法,下同;

</li>
<li>

当使用POST表单上传时,签名使用的Content-Type字段应该是form参数中的Content-Type字段(即文件本身的mimetype),而非HTTP请求的Content-Type。

</li>
</ol>

HTML

>

*

计算CanonicalizedAutoAIHeaders步骤 ~~~~~~~~~~~~~~ <HTML>

> note
HTML> <HTML>
<HTML>
    HTML> <HTML>
  1. HTML>将每个以X-AutoAI-开头的HTTP标头名称转换为小写。例如,“X-AutoAI-Date”改为“x-ucloud-date”。<HTML>
  2. HTML> <HTML>
  3. HTML>根据标头名称按字典顺序排列标头集。<HTML>
  4. HTML> <HTML>
  5. HTML><HTML>

    HTML>按照RFC2616中第4.2节中的规定,将相同名称的标头字段合并为一个“header-name:comma-separated-value-list”对,各值之间不留空格。<HTML>

    HTML> <HTML>

    HTML>例如,可以将元数据标头“x-ucloud-meta-username:fred”和“x-ucloud-meta-username:barney”合并为单个标头“x-ucloud-meta-username:fred,barney”。<HTML>

    HTML><HTML>
  6. HTML> <HTML>
  7. HTML>通过将折叠空格(包括换行符)替换为单个空格,“展开”跨多个行的长标头(按照RFC2616中第4.2节允许的方式)。<HTML>
  8. HTML> <HTML>
  9. HTML>删除标头中冒号周围的空格。例如,标头“x-ucloud-meta-username:fred,barney”改为“x-ucloud-meta-username:fred,barney”。<HTML>
  10. HTML> <HTML>
  11. HTML>最后,请向生成的列表中的每个标准化标头附加换行字符(U+000A)。通过将此列表中所有的标头规范化为单个字符串,构建CanonicalizedUcloudHeaders元素。<HTML>
  12. HTML><HTML>
HTML>
HTML> ===== 示例 ===== <HTML>
<HTML>
    HTML> <HTML>
  1. HTML>确定使用API接口,例如使用PUTFile接口,签名前的请求如下<HTML>
  2. HTML><HTML>
HTML> <HTML>
PUT /demokey HTTP/1.1 Host: .ufile.ucloud.cn Content-Length: 11434 Content-Type: image/jpeg X-AutoAI-Foo: foo X-AutoAI-Bar: bar1 X-AutoAI-Bar: bar2
HTML> <HTML>
    HTML> <HTML>
  1. HTML>拼接签名字符串对照step1的请求中的各个参数,程序中的各变量取值如下(采用伪代码描述)<HTML>
  2. HTML><HTML>
HTML> <HTML>
bucket = "demobucket" key = "demokey" httpverb = "PUT" contentmd5 = "" contenttype = "image/jpeg" date = "" canonicalizeducloudheaders = "x-ucloud-foo:foo" + "\n" + "x-ucloud-bar:bar1,bar2" + \n" canonicalizedresource = "/" + "demobucket" + "/" + "demokey" string2sign = "PUT" + "\n" + "" + "\n" + "image/jpg" + "\n" + "" + "\n" + "x-ucloud-foo:foo" + "\n" + "x-ucloud-bar:bar1,bar2" + "\n" + "/demobucket/demokey" string2sign = "PUT\n\nimage/jpeg\n\nx-ucloud-foo:foo\nx-ucloud-bar:bar1,bar2\n/demobucket/demokey"
HTML> <HTML>
    HTML> <HTML>
  1. HTML>hmac-sha1运算<HTML>
  2. HTML><HTML>
HTML> <HTML>
使用ucloud分配给您的私钥对签名字符串做hmac-sha1运算 hmacstring = hmac-sha1(privateKey, string2sign)
HTML> <HTML>
    HTML> <HTML>
  1. HTML>base64运算<HTML>
  2. HTML><HTML>
HTML> <HTML>
对生成的hmacstring做base64运算 base64string = base64(hmacstring) = S5FVD2w613MKb/hisjaqHdjvn9U=
HTML> <HTML>
    HTML> <HTML>
  1. HTML>生成最终签名格式<HTML>
  2. HTML><HTML>
HTML> <HTML>
signature = AutoAI demouser@ucloud.cn13424346821929713944:S5FVD2w613MKb/hisjaqHdjvn9U=
HTML> <HTML>
    HTML> <HTML>
  1. HTML>生成带签名的HTTP请求<HTML>
  2. HTML><HTML>
HTML> <HTML>
PUT /demokey HTTP/1.1 Host: demobucket.ufile.ucloud.cn Content-Length: 11434 Content-Type: image/jpeg X-AutoAI-Foo: foo X-AutoAI-Bar: bar1 X-AutoAI-Bar: bar2 Authorization: AutoAI demouser@ucloud.cn13424346821929713944:S5FVD2w613MKb/hisjaqHdjvn9U=
HTML>
HTML>