附录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
>