除了使用Authorization Header,您還可以在URL中加入簽名資訊,以便將該URL轉給第三方實現授權訪問。
注意事項
- 使用在URL中籤名的方式,會將授權的資料在到期時間內曝露在互連網上,請預先評估使用風險。
- OSS不支援同時在URL和Header中包含簽名。
- PUT和GET請求都支援在URL中籤名。
- 您可以為PUT操作產生一個預簽名的URL,該URL檢查使用者是否上傳了正確的內容。SDK對請求進行預簽名時,將計算請求本文的校正和,並產生包含在預簽名URL中的MD5校正和。使用者必須上傳與SDK產生的MD5校正和相同的內容,否則操作失敗。如果要驗證MD5,只需在請求中增加Content-MD5頭即可。
簽名實現
- 簽名樣本
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?OSSAccessKeyId=nz2pc56s936****&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv****
如果需要使用STS使用者構造URL簽名,則必須攜帶security-token
。https://examplebucket.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?OSSAccessKeyId=nz2pc56s936****&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv****&security-token=CAISowJ1q6Ft5B2yfSjIr5bgIOz31blR9oWmWBfCs3kDR/xm3Imc1zz2IHxMdHJsCeAcs/Q0lGFR5/sflqJIRoReREvCUcZr8szfWcsZos2T1fau5Jko1be0ewHKeQKZsebWZ+LmNpy/Ht6md1HDkAJq3LL+bk/Mdle5MJqP+/kFC9MMRVuAcCZhDtVbLRcYgq18D3bKMuu3ORPHm3fZCFES2jBxkmRi86+ysIP+phPVlw/90fRH5dazcJW0Zsx0OJo6Wcq+3+FqM6DQlTNM6hwNtoUO1fYUommb54nDXwQIvUjfbtC5qIM/cFVLAYEhALNBofTGkvl1h/fejYyfyWwWYbkFCHiPFNr9kJCUSbr4a4sjF6zyPnPWycyCLYXleLzhxPWd/2kagAGaXG69BqwYNvrKKI3W8weP3bNc1wQDMXQfiHpFCRG6lYhh3iXFtpwH90A3sTlxzRGvi8+9p63JwrluOHWs+Fj6S6s0cOhKvKRWYE8UuWeXIvv4l6DAGwHDE8BLjLC11f5prUJgI2wb+3hwuBod32Jx+us/1p996Glao725orcb****
您可以在簽名URL中添加想要授權的IP地址、IP位址區段或VPC ID,避免未授權的終端訪問OSS資源。
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?&OSSAccessKeyId=44CF9590006BF252F707&Expires=1475462111&Signature=OjxkTUbT6rXCZcW8QhvlrXQr8vsP80EFdo6oG5qsBx****&x-oss-ac-subnet-mask=32
- 參數說明
名稱 類型 是否必選 描述 OSSAccessKeyId 字串 是 指定URL簽名中使用的AccessKey ID。 Expires 數字 是 Unix時間戳記(自UTC時間1970年01月01號開始的秒數),用於標識該URL的逾時時間,單位為秒。如果OSS接收到該URL請求的時間晚於簽名中包含的Expires參數時,則返回請求逾時的錯誤碼。例如,目前時間是1141889060,開發人員希望建立一個60秒後自動失效的URL,則可以設定Expires時間為1141889120。 說明 出於安全考慮,OSS控制台中預設URL的有效時間為3600秒,最大值為32400秒。關於修改URL逾時時間的具體操作,請參見使用檔案URL。Signature 字串 是 簽名資訊。格式如下: Signature = urlencode(base64(hmac-sha1(AccessKeySecret, VERB + "\n" + CONTENT-MD5 + "\n" + CONTENT-TYPE + "\n" + EXPIRES + "\n" + CanonicalizedOSSHeaders + CanonicalizedResource)))
- 所有OSS支援的請求和各種Header參數,在URL中進行簽名的演算法和在Header中包含簽名的演算法類似。
- 產生URL中的簽名字串時,除了將Date參數替換為Expires參數外,仍然包含
CONTENT-TYPE
、CONTENT-MD5
、CanonicalizedOSSHeaders
等簽名版本1中定義的Header(請求中雖然仍有Date請求Header,但無需將Date加入簽名字串中)。 - 在URL中包含簽名時必須對URL進行編碼。如果在URL中多次傳入Signature、Expires或OSSAccessKeyId,則以第一次傳入的值為準。
- 使用URL簽名時,OSS會先驗證請求時間是否晚於Expires時間,然後再驗證簽名。
security-token 字串 否 安全性權杖。只有當使用STS使用者構造URL簽名時,才需要設定此參數。 說明 關於搭建STS服務的具體操作,請參見使用STS臨時訪問憑證訪問OSS。您可以通過調用STS服務的AssumeRole介面或者使用各語言STS SDK來擷取臨時訪問憑證。臨時訪問憑證包括臨時存取金鑰(AccessKey ID和AccessKey Secret)和安全性權杖(SecurityToken)。x-oss-ac-source-ip 字串 否 指定IP地址或者IP位址區段。如果在產生簽名時添加了IP地址或IP位址區段,則需要添加參數x-oss-ac-subnet-mask,用於標記子網路遮罩。 x-oss-ac-subnet-mask 數字 否 子網路遮罩中1的個數。如果請求中帶有該參數,OSS會將實際請求IP地址與子網路遮罩進行求與,然後用於計算簽名是否正確。如果該參數被惡意竄改,將導致簽名無法校正通過。 x-oss-ac-vpc-id 字串 否 指定VPC ID。指定該參數後,OSS會判斷是否為對應VPC ID來源的請求。如果請求是從該VPC ID發起且該參數已賦值,則同時校正VPC ID和來源IP地址或IP位址區段。 x-oss-ac-forward-allow 布爾型 否 指定是否允許轉寄請求。OSS如果檢測到該欄位並且請求中帶有 X-Forwarded-For
(可能為多個IP地址),則將X-Forwarded-For
的值用於計算簽名校正。取值如下:- true:表示允許轉寄請求。重要 設定為true存在要求標頭被篡改劫持的風險。
- false(預設值):不允許轉寄請求。
- 產生簽名的Python範例程式碼
- 樣本一(只涉及必選參數)
import base64 import hmac import hashlib import urllib h = hmac.new("accesskey", "GET\n\n\n1141889120\n/examplebucket/oss-api.pdf", hashlib.sha1) urllib.quote(base64.encodestring(h.digest()).strip())
- 樣本二(包含選擇性參數)
- 簽名時,需按照字典序升序排列可選的簽名參數。如果參數未配置則為空白。
- 當您需要指定具體IP地址訪問時,只需在產生簽名時添加IP地址(例如
x-oss-ac-source-ip=127.0.0.1
),並在query參數中提供子網路遮罩用於計算簽名(例如x-oss-ac-subnet-mask=32
)。
import base64 import hmac import hashlib import urllib h = hmac.new(accesskey, "GET\n\n\n1141889120\n%2Fexamplebucket%2Foss-api.pdf?\ &x-oss-ac-forward-allow=true\ &x-oss-ac-source-ip=127.0.0.1\ &x-oss-ac-subnet-mask=32\ &x-oss-signature-version=OSS2", hashlib.sha256) Signature = base64.encodestring(h.digest()).strip()
- 樣本一(只涉及必選參數)
SDK樣本
下表提供各語言SDK產生簽名URL的方法以及通過簽名URL上傳或下載檔案的樣本。
SDK | URL簽名方法 | GitHub樣本 | 簽名URL使用樣本 |
Java SDK | OSSClient.generatePresignedUrl | AuthorizedAccessSample.java | Java |
Python SDK | Bucket.sign_url | sts.py | Python |
PHP SDK | OssClient.signUrl | Signature.php | PHP |
Node.js SDK | Url | signatureUrl.js | Node.js |
Browser.js SDK | Url | signatureUrl.js | Browser.js |
Android SDK | OSSClient.presignConstrainedObjectURL | OSSClient.java | Android |
iOS SDK | presignConstrainURLWithBucketName:withObjectKey:httpMethod:withExpirationInterval:withParameters | OSSClient.h | iOS |
Go SDK | signURL | sign_url.go | Go |
C SDK | oss_gen_signed_url | oss_object.c | C |
C++ SDK | OssClient::GeneratePresignedUrl | OssClient.cc | C++ |
.Net SDK | OssClient.GeneratePresignedUri | UrlSignatureSample.cs | .NET |
錯誤碼
錯誤碼 | 返回訊息 | 描述 |
AccessDenied | 403 Forbidden | 在URL中添加簽名時,Signature、Expires和OSSAccessKeyId順序可以調換,但缺少Signature、Expires或OSSAccessKeyId中的一個或者多個。 |
AccessDenied | 403 Forbidden | 訪問的目前時間晚於請求中設定的Expires時間或時間格式錯誤。 |
InvalidArgument | 400 Bad Request | URL中包含Signature、Expires、OSSAccessKeyId中的一個或者多個,並且Header中也包含簽名訊息。 |