本文介绍API请求的签名机制。
签名机制
AccessKeyID和AccessKeySecret由阿里云官方颁发给访问者(可以通过阿里云AK管理控制台申请和管理),其中AccessKeyId用于标识访问者的身份,AccessKeySecret是用于加密签名字符串和服务器端验证签名字符串的密钥,这两个参数必须严格保密。
MNS服务会对每个访问的请求进行验证,每个请求向MNS提交时,都需要在该请求的header中包含签名(Authorization)。MNS通过使用AccessKeyId和AccessKeySecret进行对称加密的方法来验证请求的发送者身份。如果计算结果和提供的验证码一致,那么该请求有效;否则,MNS将拒绝处理这次请求,并返回HTTP状态码403。
您必须在HTTP请求中增加Authorization(授权)的Head来包含签名信息,表明这个消息已被授权。格式为: Authorization: MNS AccessKeyId:Signature
。
Authorization计算方法如下:
您可以使用签名验证工具来验证您生成的签名 。
Authorization = base64(hmac-sha1(HTTP_METHOD + "\n"
+ CONTENT-MD5 + "\n"
+ CONTENT-TYPE + "\n"
+ DATE + "\n"
+ CanonicalizedMNSHeaders
+ CanonicalizedResource))
HTTP_METHOD
:大写的HTTP Method。例如:PUT、GET、POST、DELETE。
Content-Md5
:请求内容数据的MD5值。如果请求的Header中没有传Content-MD5,则此处填入空串。
CONTENT-TYPE
:请求内容的类型。DATE
:此次操作的时间。此参数不能为空,目前只支持GMT格式。如果请求时间和MNS服务器时间相差超过15分钟,MNS会判定此请求不合法,返回错误码400,错误信息及错误码详见错误响应格式。格式为:
Thu, 07 Mar 2012 18:49:58 GMT
。如果用x-mns-date替代DATE,则DATE不能填空,需用x-mns-date的值替换。- CanonicalizedMNSHeaders:HTTP中的x-mns-开始的字段组合。(见下文注意事项)
说明 CanonicalizedMNSHeaders(即
x-mns-
开头的head)在签名验证前需要符合以下规范:- head的名字需要变成小写。
- head自小到大排序。
- 分割head name和value的冒号前后不能有空格。
- 每个Head之后都有一个
\n
,如果没有以x-mns-
开头的head,则在签名时CanonicalizedMNSHeaders就设置为空。
- CanonicalizedResource表示HTTP所请求资源的URI。如示例中:
/queues/$queueName?metaOverride=true
。
- 用来签名的字符串为UTF-8格式。
- 签名的方法用RFC 2104中定义的HMAC-SHA1方法,其中Key为AccessKeySecret。
- content-type和content-md5在请求中不是必须的,参数没有指定的情况下,请使用
''
代替。
示例
- 请求示例 :
PUT /queues/$queueName?metaOverride=true HTTP/1.1 Host: $AccountId.mns.cn-hangzhou.aliyuncs.com Date: Wed, 08 Mar 2012 12:00:00 GMT Authorization: MNS 15B4D3461F177624206A:xQE0diMbLRepdf3YB+FIEXAMPLE= <?xml version="1.0" encoding="UTF-8" ?> <Queue xmlns="http://mns.aliyuncs.com/doc/v1/"> <VisibilityTimeout >60</VisibilityTimeout> <MaximumMessageSize>1024</MaximumMessageSize> <MessageRetentionPeriod>120</MessageRetentionPeriod> <DelaySeconds>30</DelaySeconds> </Queue>
- 返回示例 :
-
如果传入的AccessKeyId不存在或inactive,返回403 Forbidden。
返回示例一:
Content-Type: text/xml Content-Length: 314 Date: Wed, 18Mar 2012 08:04:06 GMT x-mns-request-id: 512B2A634403E52B1956133E <?xml version="1.0" encoding="utf-8"?> <Error xmlns="http://mns.aliyuncs.com/doc/v1/"> <Code>AccessIDAuthError</Code> <Message> AccessID authentication fail, please check your AccessID and retry. </Message> <RequestId>512B2A634403E52B1956133E</RequestId> <HostId>mns.cn-hangzhou.aliyuncs.com</HostId> </Error>
-
如果签名验证的时候,header中没有传入Date或者格式不正确,返回403 Forbidden。
返回示例二:
Content-Type: text/xml Content-Length: 274 Date: Wed, 18Mar 2012 08:04:06 GMT x-mns-request-id: 512B2A634403E52B1956133E <?xml version="1.0" encoding="UTF-8"?> <Error xmlns="http://mns.aliyuncs.com/doc/v1/"> <Code>InvalidArgument</Code> <Message>Date header is invalid or missing.</Message> <RequestId>7E1A5CF258F535884403E533</RequestId> <HostId>mns.cn-hangzhou.aliyuncs.com</HostId> </Error>
-
传入请求的时间在MNS服务器当前时间之后的15分钟以内,否则返回408超时。
返回示例三:
Content-Type: text/xml Content-Length: 283 Date: Wed, 11 May 2011 09:01:51 GMT x-mns-request-id: 512B2A634403E52B1956133E <?xml version="1.0" encoding="UTF-8"?> <Error xmlns="http://mns.aliyuncs.com/doc/v1/"> <Code>TimeExpired</Code> <Message> The http request you sent is expired. </Message> <RequestId>512B2A634403E52B1956133E</RequestId> <HostId>mns.cn-hangzhou.aliyuncs.com</HostId> </Error>
-
在文档使用中是否遇到以下问题
更多建议
匿名提交