上云无忧 > 文档中心 > 天翼云对象存储(OOS经典版)I型用户签名验证(V2)Head中包含签名
对象存储
天翼云对象存储(OOS经典版)I型用户签名验证(V2)Head中包含签名

文档简介:
用户可以在HTTP请求中增加Authorization(授权)的Head来包含签名信息,表明这个消息已被授权。如果用户的请求中没有Authentication字段,则认为是匿名访问。
*产品来源:中国电信天翼云。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

Head中包含签名


用户可以在HTTP请求中增加Authorization(授权)的Head来包含签名信息,表明这个消息已被授权。如果用户的请求中没有Authentication字段,则认为是匿名访问。

验证码计算方法如下:

"Authorization: AWS" + AccessId + ":" + Signature

Signature =Base64( HMAC-SHA1( YourSecretAccessKey,   UTF-8-Encoding-Of( StringToSign ) ) ) ;

StringToSign = HTTP-VERB + "\n" +

Content-MD5 + "\n" +

Content-Type + "\n" +

Date + "\n"   +

CanonicalizedAmzHeaders + "\n"

CanonicalizedResource;

CanonicalizedResource = [ "/" + Bucket ] +

+

  [<sub-resource>];

CanonicalizedAmzHeaders

注: sub-resource,如果存在,可参与签名的参数包括: "acl", "torrent", "logging", "location", "policy", "requestPayment", "versioning", "versions", "versionId", "notification", "uploadId", "uploads", "partNumber", "website","delete", "lifecycle", "tagging", "cors", "restore"。

HMAC-SHA1是由RFC 2104定义的算法。该算法需要输入两个字符串:一个key和一个message。OOS在验证请求时,使用您的AccessSecretKey作为key,使用UTF-8编码的StringToSign作为message。HMAC-SHA1的输出同样是个字符串,被称为摘要。Signature请求参数是这个摘要的Base64编码。

说明:

1)Content-Md5表示请求内容数据的MD5值;

2)  CONTENT-TYPE表示请求内容的类型;

3)  DATE表示此次操作的时间,且必须为HTTP1.1中支持的GMT格式;

4)  CanonicalizedAmzHeaders表示http中的object user meta组合;

5)  CanonicalizedResource表示用户要访问的OOS资源

构建CanonicalizedAMZHeaders的方法

所有以“x-amz-”为前缀的HTTP Header被称为CanonicalizedAMZHeaders。它的构建方法如下:

1) 将所有以“x-amz-”为前缀的HTTP请求头的名字转换成小写字母。如’X-AMZ-Meta-Name: fred’转换成’x-amz-meta-name: fred。

2) 将上一步得到的所有HTTP请求头按照字典序进行升序排列。

3) 如果有相同名字的请求头,则根据标准RFC 2616, 4.2章进行合并(两个值之间只用逗号分隔)。如有两个名为’x-amz-meta-name’的请求头,对应的值分别为’ fred’和’ barney’,则合并后为:’x-amz-meta-name:fred,barney’。

4) 删除请求头和内容之间分隔符两端出现的任何空格。如’x-amz-meta-name: fred,barney’转换成:’x-amz-meta-name:fred,barney’。

5) 将所有的头和内容用’\n’分隔符分隔拼成最后的CanonicalizedAMZHeader。

构建CanonicalizedResource的方法

用户发送请求中想访问的OOS目标资源被称为CanonicalizedResource。它的构建方法如下:

1) 将CanonicalizedResource置成空字符串(“”);

2) 如果请求通过Host请求头来指定bucket,那么增加bucket名,并在其前面加上“/”(例如/bucketname)。对于bucket名称在path中的请求,或者没有指定bucket的请求,不做任何操作。

3)在path中增加未编码的HTTP 请求URI,到请求参数处截止,不包含请求参数。

4) 如果请求包含子资源,例如?acl, ?website, ?logging,那么将所有的子资源按照字典序,从小到大排列并以’&’为分隔符生成子资源字符串。在CanonicalizedResource字符串尾添加“?”和子资源字符串。此时的CanonicalizedResource例如:/BucketName/ObjectName?acl

在构造CanonicalizedResource时,必须包含的子资源包括:acl, lifecycle, location, logging, notification, partNumber, policy,   requestPayment,torrent, uploadId, uploads, versionId, versioning, versions   and website.

如果请求通过参数指定了要覆盖的响应头,那么在CanonicalizedResource后加上该请求参数和值。当进行签名时,不要对这些值进行编码。但是当发送请求的时候,用户必须对这些参数值进行编码。GET请求中的这些参数包括:response-content-type,response-content-language,   response-expires, response-cache-control,response-content-disposition,   response-content-encoding.

例子:/BucketName/ObjectName?response-content-type=ContentType

当发送批量删除对象请求时,delete参数需要包含在CanonicalizedResource中。

StringToSign中不包含Content-Type, Date, Content-MD5这些请求头的名字,只包含这些请求头的值。但是以“x-amz”开头的请求头的名字和值都包含在StringToSign中。

如果在请求中,Content-Type, Content-MD5等请求头不存在,那么该位置用空串("")来代替。

使用Base64编码

HMAC请求签名必须使用Base64编码。Base64编码将签名转换为简单的能附加到请求中的ASCII编码字符串。加号和斜杠这两个字符不能直接在URL中使用,必须经过编码。比如,如果授权编码包括加号,在URL中把它编码成为%2B。

时间戳说明

在签名时必须使用时间戳,可以用HTTP的Date请求头,也可以用x-amz-date请求头。时间戳中的时间和OOS的系统时间不能相差15分钟以上,否则,OOS会返回错误码RequestTimeTooSkewed。

有些HTTP客户端不能设置Date请求头,如果你在签名时设置Date请求头有困难,那么你可以使用x-amz-date请求头来传送时间戳。x-amz-date请求头需要符合RFC 2616 的格式。当请求中包含x-amz-date头时,OOS在计算签名时会忽略Date头。所以如果请求中有x-amz-date头,在客户端计算签名时,Date头的值应设置为空串。

示例

1.GET Object

从名为johnsmith的bucket中get 对象

请求

StringToSign

GET /photos/puppy.jpg HTTP/1.1

Host: johnsmith.oos.ctyunapi.cn

Date: Tue, 27 Mar 2007 19:36:42

+0000

Authorization: AWS

7799e793ce4624ee7e5a:xXjDGYUmKxnwqr5KXNPGldn5LbA=

GET\n

\n

\n

Tue, 27 Mar 2007 19:36:42 +0000\n

/johnsmith/photos/puppy.jpg

注意:CanonicalizedResource中包含bucket名称,但是HTTP 请求URI中没有,因为bucket名称是在Host请求头中指定的。

2.PUT Object

向名为johnsmith的bucket中上传一个对象

请求

StringToSign

PUT /photos/puppy.jpg HTTP/1.1

Content-Type: image/jpeg

Content-Length: 94328

Host: johnsmith.oos.ctyunapi.cn

Date: Tue, 27 Mar 2007 21:15:45   +0000

Authorization: AWS

7799e793ce4624ee7e5a:hcicpDDvL9SsO6AkvxqmIWkmOuQ=

PUT\n

\n

image/jpeg\n

Tue, 27 Mar 2007 21:15:45 +0000\n

/johnsmith/photos/puppy.jpg

注意: Content-Type请求头包含在请求中,也包含在StringToSign中。但请求中没有Content-MD5请求头,所以StringToSign中是空行。

3.List Objects

list 名为johnsmith的bucket的对象。

请求

StringToSign

GET   /?prefix=photos&max-keys=50&marker=puppy

HTTP/1.1

User-Agent: Mozilla/5.0

Host: johnsmith.oos.ctyunapi.cn

Date: Tue, 27 Mar 2007 19:42:41   +0000

Authorization: AWS

7799e793ce4624ee7e5a:jsRt/rhG+Vtp88HrYL706QhE4w4=

GET\n

\n

\n

Tue, 27 Mar 2007 19:42:41

+0000\n

/johnsmith/

注意:CanonicalizedResource的结尾要有斜杠/,查询字符串为空。

4.获取ACL

下面的例子是获取名为johnsmith的bucket的访问控制权限配置信息。

请求

StringToSign

GET /?acl HTTP/1.1

Host: johnsmith.oos.ctyunapi.cn

Date: Tue, 27 Mar 2007 19:44:46   +0000

Authorization: AWS

7799e793ce4624ee7e5a:thdUi9VAkzhkniLj96JIrOPGi0g=

GET\n

\n

\n

Tue, 27 Mar 2007 19:44:46

+0000\n

/johnsmith/?acl

注意:在CanonicalizedResource中是如何包含子资源查询字符串参数的。

5.Delete Object

从名为johnsmith的bucket中删除对象。bucket在path中指定,并使用x-amz-date请求头。

请求

StringToSign

DELETE /johnsmith/photos/puppy.jpg   HT

TP/1.1

User-Agent: dotnet

Host: oos.ctyunapi.cn

Date: Tue, 27 Mar 2007 21:20:27   +0000

x-amz-date: Tue, 27 Mar 2007   21:20:26

+0000

Authorization: AWS

7799e793ce4624ee7e5a:k3nL7gH3+PadhTEVn5Ip83xlYzk=

DELETE\n

\n

\n

\n

x-amz-date:Tue, 27 Mar 2007 21:20:26

+0000\n

/johnsmith/photos/puppy.jpg

注意:此请求使用x-amz-date请求头来替代Date请求头,在StringToSign中,实际的Date请求头被设置成空行。

6.使用CNAME形式上传对象

下面的例子通过CNAME 形式上传对象,并使用自定义元数据。

请求

StringToSign

PUT /db-backup.dat.gz HTTP/1.1

User-Agent: curl/7.15.5

Host: static.johnsmith.net:8080

Date: Tue, 27 Mar 2007 21:06:08   +0000

x-amz-acl: public-read

content-type:   application/x-download

Content-MD5:   4gJE4saaMU4BqNR0kLY+lw==

X-Amz-Meta-ReviewedBy:   joe@johnsmith.net

X-Amz-Meta-ReviewedBy:   jane@johnsmith.net

X-Amz-Meta-FileChecksum: 0x02661779

X-Amz-Meta-ChecksumAlgorithm: crc32

Content-Disposition: attachment;   file

name=database.dat

Content-Encoding: gzip

Content-Length: 5913339

Authorization: AWS

7799e793ce4624ee7e5a:C0FlOtU8Ylb9KDTpZqYkZPX91iI=

PUT\n

4gJE4saaMU4BqNR0kLY+lw==\n

application/x-download\n

Tue, 27 Mar 2007 21:06:08 +0000\n

x-amz-acl:public-read\n

x-amz-meta-checksumalgorithm:crc32\n

x-amz-meta-filechecksum:0x02661779\n

x-amz-meta-reviewedby:

joe@johnsmith.net,jane@johns

mith.net\n

/static.johnsmith.net/dbbackup.

dat.gz

注意,“x-amz -”请求头被排序了,空白行被删除,转换为小写字符,多个同名的请求头使用逗号分隔的方式被加入。只有Content-Type, Content-MD5请求头被加入到了StringToSign中,但是其他的Content-*请求头没有被加入。

7.List Buckets

请求

StringToSign

GET / HTTP/1.1

Host: oos.ctyunapi.cn

Date: Wed, 28 Mar 2007 01:29:59   +0000

Authorization: AWS

7799e793ce4624ee7e5a:Db+gepJSUbZKwpx1FR0DLtEYoZA=

GET\n

\n

\n

Wed, 28 Mar 2007 01:29:59

+0000\n

/

8.对象名被编码

请求

StringToSign

GET /diction

ary/fran%C3%A7ais/pr%c3%a9f%c3%a8re   HT

TP/1.1

Host: oos.ctyunapi.cn

Date: Wed, 28 Mar 2007 01:49:49   +0000

Authorization: AWS 7799e793ce4624ee7e5a:dxhSBHoI6eVSPcXJqEghlUzZMnY=

GET\n

\n

\n

Wed, 28 Mar 2007 01:49:49 +0000\n

/diction

ary/fran%C3%A7ais/pr%c3%a9f%c3%a8re

StringToSign中从请求URI获取的元素,是按原样获取的,包括URL编码和大小写。

相似文档
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部