本文介绍API请求的签名机制的构成、计算方法和示例。

签名构成

消息服务MNS服务会对每个访问的请求进行验证,每个请求向消息服务MNS提交时,都需要在该请求的Header中包含签名(Authorization)。消息服务MNS通过使用AccessKeyId和AccessKeySecret进行对称加密的方法来验证请求的发送者身份。如果计算结果和提供的验证码一致,那么该请求有效;如果计算结果和提供的验证码不一致,那么消息服务MNS将拒绝处理这次请求,并返回HTTP状态码403。

您必须在HTTP请求中增加Authorization的Head来包含签名信息,表明这个消息已被授权。格式为: Authorization: MNS AccessKeyId:Signature

您可以使用阿里云账号通过阿里云AK管理控制台申请和管理AccessKeyID和AccessKeySecret。AccessKeyId用于标识访问者的身份,AccessKeySecret是用于加密签名字符串和服务器端验证签名字符串的密钥,这两个参数必须严格保密。

计算方法

您可以使用签名验证工具来验证您生成的签名 。

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:本次操作的时间。
    • 格式为:Thu, 07 Mar 2012 18:49:58 GMT。如果用x-mns-date替代DATE,则DATE不能填空,需用x-mns-date的值替换。
    • 此参数不能为空,目前只支持GMT格式。
    • 如果请求时间和消息服务MNS服务器时间相差超过15分钟,消息服务MNS会判定此请求不合法,返回错误码400。更多错误信息及错误码,请参见错误响应格式
  • CanonicalizedMNSHeaders:HTTP中的x-mns-开头的字段组合。
    该字段在签名验证前需要符合以下规范:
    • 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 15B4D3461F177624****:xQE0diMbL****f3YB+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不存在或disabled,返回403 Forbidden。

Content-Type: text/xml
Content-Length: 314
Date: Wed, 18Mar 2012 08:04:06 GMT
x-mns-request-id: 512B2A634403E52B1956****

<?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>512B2A634403E52B1956****</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: 512B2A634403E52B1956****

<?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>7E1A5CF258F535884403****</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: 512B2A634403E52B1956****

<?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>512B2A634403E52B1956****</RequestId>
<HostId>mns.cn-hangzhou.aliyuncs.com</HostId>
</Error>