寫在前面
阿裡雲oss的各種sdk,都是對它的API進行的封裝。是以如果我們直接調用API時出錯,卻又不知道哪裡出問題時,可以直接閱讀sdk的源碼,找到問題所在。
1 Authorization的計算方式
首先貼一下阿裡雲oss官網貼出的簽名計算方式:
Authorization = "OSS " + AccessKeyId + ":" + Signature
Signature = base64(hmac-sha1(AccessKeySecret,
VERB + "\n"
+ Content-MD5 + "\n"
+ Content-Type + "\n"
+ Date + "\n"
+ CanonicalizedOSSHeaders
+ CanonicalizedResource))
通過計算方法可以看出Authorization是由四部分組成:
1. 字元串
OSS
(注意OSS後面有一個空格)
2. AccessKeyId,也就是oss Bucket的使用者名。可以在OSS控制台 - 對象存儲OSS - 概覽,在頁面的右側即可看到AccessKey選項,點進去可以檢視。
3. 字元串
:
4. Signature簽名,這裡再貼一下阿裡雲oss官網給出的計算說明:
- AccessKeySecret 表示簽名所需的密鑰
- VERB表示HTTP 請求的Method,主要有PUT,GET,POST,HEAD,DELETE等
- \n 表示換行符
- Content-MD5 表示請求内容資料的MD5值,對消息内容(不包括頭部)計算MD5值獲得128比特位數字,對該數字進行base64編碼而得到。該請求頭可用于消息合法性的檢查(消息内容是否與發送時一緻),如”eB5eJF1ptWaXm4bijSPyxw==”,也可以為空。詳情參看RFC2616 Content-MD5
- Content-Type 表示請求内容的類型,如”application/octet-stream”,也可以為空
- Date 表示此次操作的時間,且必須為GMT格式,如”Sun, 22 Nov 2015 08:16:38 GMT”
- CanonicalizedOSSHeaders 表示以 x-oss- 為字首的http header的字典序排列
-
CanonicalizedResource 表示使用者想要通路的OSS資源
這裡的前幾項相信大家都可以看懂,隻是後面的CanonicalizedOSSHeaders 、CanonicalizedResource 有些迷惑,不知道具體的規則,真正使用時會發現按照上述計算方式得出的簽名,使用時會被oss的伺服器拒絕,傳回簽名錯誤。當初這裡也困擾了我很長時間,下面就寫一下這裡到底要如何計算。
例子
這裡拿object的put API舉例說明:
- put檔案的官方api
- 請求工具Postman
- 上傳檔案 aa.txt
PUT /ObjectName HTTP/1.1
Content-Length:ContentLength
Content-Type: ContentType
Host: BucketName.oss-cn-hangzhou.aliyuncs.com
Date: GMT Date
Authorization: SignatureValue
步驟
1.生成Signature之前的參數
VERB: "post"
Content-MD5: "" //如果沒有MD5可以為空字元串
Content-Type: "text/plain"
Date: "Tue, 26 Sep 2017 07:10:15 GMT" //GMT格式時間
CanonicalizedOSSHeaders: ["x-oss-date:Tue, 26 Sep 2017 07:10:15 GMT","x-oss-user-agent:aliyun-sdk-js/4.10.0 Chrome 60.0.3112.113 on Windows 10 64-bit"]
CanonicalizedResource: "/bucket/aa.txt" //bucket為你的bucket名稱
上面的CanonicalizedOSSHeaders實際上是一個數組,第一個元素為x-oss-date,值與Date一樣,後面的x-oss-user-agent是從oss-sdk源碼上拔下來的,可以直覺看出包含了sdk、浏覽器版本、系統版本等資訊。
2.将前面的參數拼接成一個字元串
從Signature的規則中,每個參數後面都要加一個換行符,進而組成一個字元串。我們先将以上參數放在一個數組中。(CanonicalizedOSSHeaders有兩項則在數組中有兩個元素,這裡需要注意)
"PUT"
""
"text/plain"
"Tue, 26 Sep 2017 07:10:15 GMT"
"x-oss-date:Tue, 26 Sep 2017 07:10:15 GMT"
"x-oss-user-agent:aliyun-sdk-js/4.10.0 Chrome 60.0.3112.113 on Windows 10 64-bit"
"/chengyanzhao/aa.txt"
然後使用array的join(‘\n’)方法合并成一個字元串
"PUT
text/plain
Tue, Sep :: GMT
x-oss-date:Tue, Sep :: GMT
x-oss-user-agent:aliyun-sdk-js/. Chrome . on Windows -bit
/chengyanzhao/aa.txt"
這樣Authorization = “OSS ” + AccessKeyId + “:” + Signature中的計算參數我們就有了,套入base64和hmac-sha1計算方式即可得出Authorization。
3.發送請求
headers
body
response
另外這裡有一個demo,是在阿裡雲論壇上找到的,為了友善學習我在網盤中分享,密碼:9d54。
2 修改檔案的中繼資料
2.1 修改檔案的下載下傳名
首先要了解,控制檔案的下載下傳名,其實就是控制headers中的Content-Disposition。通過修改它的值來實作修改檔案下載下傳名。
修改檔案下載下傳名可分兩種方式:
- 上傳時設定
- 上傳後設定
這裡使用js-oss-sdk來說明。
1.上傳時設定
阿裡oss提供了多種上傳方式,但每種上傳方法都接受一個options參數,這個參數即可設定檔案的中繼資料。
headers:{
'Content-Disposition': 'attachment;filename=' + encodeURI(fileName)
}
2.上傳後設定
檔案上傳後修改檔案的下載下傳名,其實就是使用阿裡提供的接口修改檔案的中繼資料中的Content-Disposition。
在js-oss-sdk中,使用copy方法設定檔案的中繼資料
// key為oss中檔案的key,也就是在oss控制台中現實的檔案名。
client.copy(key, key, {
headers:{
'Content-Disposition': 'attachment;filename=' + encodeURI(fileName)
}
})
2.2 修改其他中繼資料
了解本質,oss的檔案中繼資料資訊都是通過headers傳輸,是以這裡還是通過copy方法,将新的中繼資料放在options參數中,與上面的修改檔案後修改檔案下載下傳名用法相同,這裡就不多贅述。