186
云计算
负载均衡
产品简介
产品价格
快速入门
用户指南
实践操作
常见问题
购买指南
云服务器
产品简介
计费规则
购买指导
控制台使用指南
常见问题
云数据库
产品简介
计费规则
购买指导
快速入门
连接实例
控制台使用指南
对象存储
产品简介
控制台使用指南
程序员百科
Python
天翼云对象存储(经典版)I型API参考-用户签名验证(V4)使用查询参数验证

产品推荐:

1、安全稳定的云服务器租用,2核/2G/5M仅37元,点击抢购>>>

2、高防物理服务器20核/16G/50M/500G防御仅350元,点击抢购>>>

3、百度智能建站(五合一网站)仅880元/年,点击抢购>>> 模板建站(PC+手机站)仅480元/年,点击抢购>>>

4、阿里云服务器2核2G3M仅99元/年、2核4G5M仅199元/年,新老同享,点击抢购>>> 

5、腾讯云服务器2核2G4M仅99元/年、新老同享,点击抢购>>>   



点击这里注册天翼云特邀VIP帐号,立即体验天翼云对象存储>>>


天翼云对象存储(经典版)I型API参考-用户签名验证(V4)使用查询参数验证


概述

用户可以使用查询字符串参数验证身份信息,此方法也称为预签名URL。预签名URL的用例场景是用户可以授予对OOS资源的临时访问权限。例如,用户可以在网站上包含预先签名的URL,或者在命令行客户端(例如Curl)中使用它来下载对象。

预签名URL支持GET、DELETE、PUT、HEAD、POST请求。

注意:使用预签名URL方式,有将您授权的数据在过期时间内曝露在互联网上的风险,建议您预先评估后使用。

以下是预签名URL的示例。

https://oos-cn.ctyunapi.cn/examplebucket/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=<your-access-key-id>/20180721/<oos-region>/s3/aws4_request
&X-Amz-Date=20180721T201207Z
&X-Amz-Expires=86400
&X-Amz-SignedHeaders=host
&X-Amz-Signature=<signature-value>

预签名URL方式需要注意:

  • 预签名URL方式必须包含的字段:X-Amz-Date、X-Amz-Algorithm、X-Amz-Signature、X-Amz-SignedHeaders、X-Amz-Credential和X-Amz-Expires。字段的顺序可以互换,如果缺少其中一个,返回错误信息。

  • 如果访问时间晚于请求中X- Amz-Expires时间或者设置的时间格式错误,返回错误信息。

  • 如果在URL和Header中同时包含签名,以Header中的签名为准。

  • 该X-Amz-CredentialURL中的值仅显示可读性“/”字符。在实践中,它应编码为%2F。例如:

&X-Amz-Credential=<your-access-key-id>%2F20180721%2F<oos-region>%2Fs3%2Faws4_request

下表介绍了URL中提供身份验证信息的查询参数。

查询字符串参数

描述

X-Amz-Algorithm

确定OOS签名的版本以及用于计算签名的算法。取值为AWS4-HMAC-SHA256。

X-Amz-Credential

用户的accessKeyId和范围信息,范围信息包括请求日期、区域、服务、终止字符串aws4_request,格式如下:

<your-access-key-id>/<date>/<region>/<service>/aws4_request

其中:

l  date格式为YYYYMMDD。

l  region:

n  对于oos api:访问域名为oos-xx.ctyunapi.cn,region为xx。各资源池的详细访问域名详见 Endpoint列表

n  对于统计api:访问域名为oos-xx-mg.ctyunapi.cn,region为xx,各资源池的详细访问域名详见Endpoint列表

n  对于操作跟踪api:访问域名为oos-xx-cloudtrail.ctyunapi.cn,region为xx,各资源池的详细访问域名详见 Endpoint列表

n  对于iam api:访问域名为oos-xx-iam.ctyunapi.cn,region为xx,各资源池的详细访问域名详见 Endpoint列表

l  service:

n  若使用OOS API服务,service为s3;

n  若使用统计分析服务,service为s3;

n  若使用操作跟踪服务,service为cloudtrail;

若使用IAM服务,service为sts。

X-Amz-Date

日期和时间格式必须遵循ISO 8601标准,并且必须使用“yyyyMMddTHHmmssZ”格式进行格式化。例如,如果日期和时间是“08/01/2018 15:32:41.982-700”,则必须首先将其转换为UTC(协调世界时),然后提交为“20180801T083241Z”。

X-Amz-Expires

提供生成的预签名URL有效的时间段(以秒为单位)。例如,86400(24小时)。该值是整数。您可以设置的最小值为1,最大值为604800(七天)。

X-Amz-SignedHeaders

列出用于计算签名的标头。签名计算中需要以下标头:

  • HTTP host标头。

  • x-amz-*请求头。

X-Amz-Signature

提供签名以验证您的请求。此签名必须与OOS计算的签名相匹配;否则,OOS拒绝该请求。

签名过程

下图说明了签名计算过程。

下表描述了图中显示的功能。用户需要为这些功能实现代码。

功能

描述

Lowercase()

将字符串转换为小写。

Hex()

小写十六进制编码。

SHA256Hash()

安全散列算法(SHA)加密散列函数。

HMAC-SHA256()

使用提供的签名密钥的SHA256算法计算HMAC。这是最终的签名。

Trim()

删除任何前导或尾随空格。

UriEncode()

URI编码每个字节。UriEncode()必须强制执行以下规则:

  • URI编码除了下面字符之外的每个字节:'A' - 'Z','a' - 'z','0' - '9',' - ','.','_'和'〜'。

  • 空格字符是保留字符,必须编码为“%20”(而不是“+”)。

  • 每个URI编码字节由'%'和两位十六进制值组成。

  • 十六进制值中的字母必须为大写,例如“%1A”。

  • 除了对象名之外,对正斜杠字符'/'进行编码。例如,如果对象名称为photos/Jan/sample.jpg,则不对键名称中的正斜杠进行编码。

重要

建议您编写自己的自定义UriEncode函数,以确保您的编码可以正常工作。

以下是Java中的示例UriEncode()函数。

public static String UriEncode(CharSequence   input, boolean encodeSlash) {

            StringBuilder result = new StringBuilder();

            for (int i = 0; i < input.length(); i++) {

                char ch = input.charAt(i);

                if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' &&   ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch ==   '-' || ch == '~' || ch == '.') {

                    result.append(ch);

                } else if (ch == '/') {

                    result.append(encodeSlash ? "%2F" : ch);

                } else {

                    result.append(toHexUTF8(ch));

                }

          }

            return result.toString();

      }

使用参数的签名过程与使用请求头的签名过程类似,如下所示:

  • 由于创建预签名URL的时候,并不知道有效负载的内容,所以设置常量UNSIGNED-PAYLOAD。

  • 规范查询字符串(Canonical Query String)必须包括除了X-Amz-Signature之外的所有上述查询字符串。

规范标头必须包括HTTP Host标头。如果用户想包含x-amz-*请求头,这些标头都将参与签名计算。用户可以选择其他的请求头是否参与签名计算。安全起见,尽可能多的请求头参与签名计算。

生成签名的示例

通过创建预签名URL的方式,与其他人共享examplebucket中test.txt对象,过期时间设置为7天(604800秒)。以GET请求为例:

GET
http://oos-cn.ctyunapi.cn/examplebucket/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=2a948fd3f00ba0925806/20190220/cn/s3/aws4_request
&X-Amz-Date=20190220T095256Z
&X-Amz-Expires=604800
&X-Amz-SignedHeaders=host
&X-Amz-Signature=<signature-value>

以下步骤首先说明如何计算签名和构建预签名URL。示例中使用的访问密钥如下:

参数

AWSAccessKeyId

2a948fd3f00ba0925806

AWSSecretAccessKey

ef2017c2e5ffa0b1761717ecbca021da16501384

1)      StringToSign

a.     创建规范请求(以GET请求为例)

GET
/examplebucket/test.txt
X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=2a948fd3f00ba0925806%2F20190220%2Fcn%2Fs3%2Faws4_request&X-Amz-Date=20190220T095256Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host
host:oos-cn.ctyunapi.cn
 
host
UNSIGNED-PAYLOAD

b.     待签名字符串

AWS4-HMAC-SHA256
20190220T095256Z
20190220/cn/s3/aws4_request
023d2e0e5fba779afb9fe621e9413622e7f1aff9ffc7348e55d0805d97cb1571

2)      StringKey

signingkey=HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20190220"),"cn"),"s3"),"aws4_request")

3)      签名

f566134de06fb3daa22b9649baf82d15d6aa575e146b6ba9aff13a2bde63a1ec

4)     将签名信息添加到请求头

http://oos-cn.ctyunapi.cn/examplebucket/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=2a948fd3f00ba0925806/20190220/cn/s3/aws4_request&X-Amz-Date=20190220T095256Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=f566134de06fb3daa22b9649baf82d15d6aa575e146b6ba9aff13a2bde63a1ec


这条帮助是否解决了您的问题? 已解决 未解决

提交成功!非常感谢您的反馈,我们会继续努力做到更好! 很抱歉未能解决您的疑问。我们已收到您的反馈意见,同时会及时作出反馈处理!