OSS上傳回撥支援自定義header以及v2版本簽名

秋二發表於2017-10-31

上傳回撥(callback)是OSS的一個重要功能,可以應用在客戶端與伺服器端資料同步等一些場景。上傳回撥功能支援在回撥的body中傳入資訊,但是在一些場景下,使用者希望能夠在回撥給應用伺服器的請求header中傳入自定義的header,用於滿足伺服器端的一些特殊需求。因此OSS在callback現有功能基礎上支援了自定義header,並加強了簽名演算法,將header加入了簽名中,支援v2版本簽名,增強了安全性。

如果對上傳回撥功能不瞭解,請先閱讀此文件https://help.aliyun.com/document_detail/31989.html?spm=5176.doc31853.2.5.2lI4WS

一、傳入引數的變化

       callback功能是通過x-oss-callback這個header傳入的引數來指定。這個header的value格式詳細參考https://help.aliyun.com/document_detail/31989.html?spm=5176.doc31853.2.5.2lI4WS,在這個結構基礎上,新增了兩個欄位,用於支援自定義header和v2版本簽名。詳細介紹如下:

欄位

說明

示例

signatureVersion

可選,預設值是“1.0”。目前支援的值是“1.0”和“2.0”,“1.0”指預設的簽名演算法,“2.0”指本文描述的簽名演算法

“signatureVersion” :
“2.0”

additionalHeaders

可選,是一個map,表示OSS回撥給使用者的自定義header,除了“x-oss-”開頭的header以及額外保留的header外,其餘header都可以傳遞,最大支援10個自定義header,自定義header的key只允許數字橫槓以及小寫字母。保留的header如下:

Content-Type

Content-Length

Host

Authorization

User-Agent

Content-Md5

Expect

Upgrade

Keep-Alive

“additionalHeaders” : {

   
“my-header” : “abc”,

   
“any-header” : “abc”

}

 

       下面是一個完整的例子:

{

   
“callbackUrl” : “www.test.com”,

   
“callbackHost” : “www.test.com”,

   
“callbackBodyType” : “application/x-www-form-urlencoded”,

   
“callbackBody” : “just for test”,

   
“signatureVersion” : “2.0”,

   
“additionalHeaders” : {

       
“my-header” : “abc”,

       
“any-header” : “def”

   
}

}

 

二、接收到的請求的變化

       如果指定了自定義header以及v2版本簽名,應用伺服器接收到的請求中以下header將會增加或者變動:

header

說明

示例

使用者指定的自定義header

使用者通過additionalHeaders欄位指定的header都會體現在回撥請求中

“my-header”:”abc”

“any-header”:”def”

x-oss-additional-headers

這個欄位的內容是使用者傳入的自定義header的key列表,以逗號分隔

x-oss-additional-headers:any-header,my-header

x-oss-signature-version

預設是”1.0”,如果指定用v2版本簽名,值會相應的變為”2.0”

x-oss-signature-version:2.0

 

       比如上例的callback請求,應用伺服器將會收到以下POST請求:

POST / HTTP/1.1

Host: www.test.com

Connection: close

Content-Length: 13

any-header: def

Authorization: PN7y979+gYNtSdJzEhdYnz/GCSUFF1L/SY6a6kvdy326A2JDryBjZj4sbAq3JVjTydngi4CihGfrq0V7pzZJKQ==

Content-MD5: /ddPByElLVc6RX1St8jL+Q==

Content-Type:
application/x-www-form-urlencoded

Date: Tue, 31 Oct 2017 01:58:58 GMT

my-header: abc

User-Agent: aliyun-oss-callback

x-oss-additional-headers:
any-header,my-header

x-oss-bucket: guoping-file

x-oss-owner: 1517986058650554

x-oss-pub-key-url:
aHR0cHM6Ly9nb3NzcHVibGljLmFsaWNkbi5jb20vY2FsbGJhY2tfcHViX2tleV92MS5wZW0=

x-oss-request-id:
59F7D8E12084A5D5E8F5EA92

x-oss-requester: 1517986058650554

x-oss-signature-version: 2.0

x-oss-tag: CALLBACK

 

just for test

 

三、v2版本簽名演算法

       v1版本的簽名演算法只是將uri和body加到了簽名中,由於OSS本身會傳遞一些以x-oss-開頭的header,而且使用者可能會自定義一些header,都需要加入到簽名中,因此oss支援了v2版本的簽名。v2版本簽名演算法與v1版本唯一不同的地方是待簽名字串的組織方式不一樣,其他比如使用RSA演算法都保持一致。

       v2版本待簽名字串的組織方式如下:

StrToSign = “POST” + “

        
+ Content-MD5 + “

        
+ Content-Type + “

        
+ Date + “

        
+ headers

        
+ uri

        
+ queryString

注:

1、Content-Md5。即Content-MD5頭的值,比如上例為” /ddPByElLVc6RX1St8jL+Q==”,這個header按照標準的協議生成,可以用於驗證body是否被篡改,因此v2版本的簽名將此header籤進去,並不再將body籤進去。

2、Content-Type。即Content-Type頭的值,上例為” application/x-www-form-urlencoded”

3、Date。即Date頭的值,上例為” Tue,
31 Oct 2017 01:58:58 GMT”。

4、headers。包括使用者自定義的header以及x-oss-開頭的header。包括兩個部分:

1) 由自定義header以及x-oss-開頭的header按照key的小寫字典序排列的key
value對,按照ToLower(key) + “:” + value + “
”的方式一一加入到待簽名字串中。

2) 自定義header的key按照字典序排列後用”;”連線,最後再加上”
”後加入到待簽名字串中。

5、uri。即回撥的uri,需要注意的是需要做url編碼。

6、queryString。將請求引數按照字典序排列,然後按照UrlEncode(key) + “=” + UrlEncode(value)的方式組織成一個單元,每一個單元再用”&”連線後,加入到”?”後面組成一個新的字串,需要注意的是,如果請求引數中的key有重複,需要將重複的key和value都新增到待簽名字串中。如果沒有請求引數,則不需要加此項

       生成待簽名字串後,剩下的就與v1版本相同,即authorization = base64_encode(rsa_sign(private_key, StrToSign, md5)),生成的簽名與v1版本一樣放在authorization頭中。

四、示例

       下面以一個簡單的python版本的應用伺服器,來演示自定義header以及v2版本簽名的使用。

       執行附件的應用伺服器示例程式碼,python2.7 callback_app_server.py,注意需要安裝M2Crypto庫。按照上例給出的x-oss-callback引數發起callback請求(將其中的callbackUrl改成你實際執行callback_app_server.py的地址和埠),即可回撥成功。有任何問題,歡迎加入釘釘群(11799757)溝通交流。



相關文章