閱讀723 返回首頁    go 微信


請求簽名機製__調用方式_API使用手冊_消息服務-阿裏雲

Access Key ID和Access Key Secret 由阿裏雲官方頒發給訪問者(可以通過阿裏雲官方網站申請和管理),其中 Access Key ID 用於標識訪問者的身份;Access Key Secret 是用於加密簽名字符串和服務器端驗證簽名字符串的密鑰,必須嚴格保密,隻有阿裏雲和用戶知道。

MNS 服務會對每個訪問的請求進行驗證,每個向 MNS 提交的請求,都需要在請求中包含簽名(Signature)信息。MNS 通過使用 Access Key ID 和 Access Key Secret 進行對稱加密的方法來驗證請求的發送者身份。如果計算出來的驗證碼和提供的一樣即認為該請求是有效的;否則,MNS 將拒絕處理這次請求,並返回 HTTP 403 錯誤。

用戶可以在 HTTP 請求中增加 Authorization(授權)的 Head 來包含簽名信息,表明這個消息已被授權。

MNS 要求將簽名包含在 HTTP Header 中,格式如下: Authorization: MNS AccessKeyId:Signature

Signature計算方法如下:

    Signature = base64(hmac-sha1(VERB + "n" 
                + CONTENT-MD5 + "n" 
                + CONTENT-TYPE + "n" 
                + DATE + "n" 
                + CanonicalizedMNSHeaders
                + CanonicalizedResource))
  • VERB 表示HTTP的Method(如示例中:PUT)
  • Content-Md5 表示請求內容數據的MD5值
  • CONTENT-TYPE 表示請求內容的類型
  • DATE 表示此次操作的時間,不能為空,目前隻支持GMT格式,如果請求時間和MNS服務器時間相差超過15分鍾,MNS會判定此請求不合法,返回400錯誤,錯誤信息及錯誤碼詳見本文檔第5部分。(如示例中:Thu, 17 Mar 2012 18:49:58 GMT
  • CanonicalizedMNSHeaders表示 http中的x-mns-開始的字段組合。(見下文注意事項)
  • CanonicalizedResource表示http所請求資源的URI(統一資源標識符)。(如示例中:/queues/$queueName?metaOverride=true

注意:

CanonicalizedMNSHeaders(即x-mns-開頭的head)在簽名驗證前需要符合以下規範:

  • head的名字需要變成小寫
  • head自小到大排序
  • 分割head name和value的冒號前後不能有空格
  • 每個Head之後都有一個n,如果沒有以x-mns-開頭的head,則在簽名時CanonicalizedMNSHeaders就設置為空

其他:

  1. 用來簽名的字符串為UTF-8格式。
  2. 簽名的方法用RFC 2104。中定義的HMAC-SHA1方法,其中Key為AccessKeySecret。
  3. 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="https://mns.aliyuncs.com/doc/v1/">
    <VisibilityTimeout >60</VisibilityTimeout>
    <MaximumMessageSize>1024</MaximumMessageSize>
    <MessageRetentionPeriod>120</MessageRetentionPeriod>
    <DelaySeconds>30</DelaySeconds>
    </Queue>

如果傳入的AccessKey Id不存在或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="https://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>

如果簽名驗證的時候,頭中沒有傳入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="https://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="https://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>

最後更新:2016-11-23 17:16:04

  上一篇:go 返回結果__調用方式_API使用手冊_消息服務-阿裏雲
  下一篇:go Endpoint簽名認證__調用方式_API使用手冊_消息服務-阿裏雲