閱讀361 返回首頁    go windows


在URL中包含簽名__訪問控製_API 參考_對象存儲 OSS-阿裏雲

除了使用Authorization Head,用戶還可以在URL中加入簽名信息,這樣用戶就可以把該URL轉給第三方實現授權訪問。

實現方式

URL簽名示例:

  1. https://oss-example.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?AccessKeyId=AccessKeyId&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D

URL簽名,必須至少包含Signature,Expires,AccessKeyId三個參數。

  • Expires 這個參數的值是一個UNIX時間(自UTC時間1970年1月1號開始的秒數,詳見wiki),用於標識該URL的超時時間。如果OSS接收到這個URL請求的時候晚於簽名中包含的Expires參數時,則返回請求超時的錯誤碼。例如:當前時間是1141889060,開發者希望創建一個60秒後自動失效的URL,則可以設置Expires時間為1141889120。
  • AccessKeyId 即密鑰中的AccessKeyId。
  • Signature 表示簽名信息。所有的OSS支持的請求和各種Header參數,在URL中進行簽名的算法和在Header中包含簽名的算法基本一樣。
    1. Signature = urlencode(base64(hmac-sha1(AccessKeySecret,
    2. VERB + "n"
    3. + CONTENT-MD5 + "n"
    4. + CONTENT-TYPE + "n"
    5. + EXPIRES + "n"
    6. + CanonicalizedOSSHeaders
    7. + CanonicalizedResource)))

其中,與header中包含簽名相比主要區別如下:

  1. 通過URL包含簽名時,之前的Date參數換成Expires參數。
  2. 不支持同時在URL和Head中包含簽名。
  3. 如果傳入的Signature,Expires,OSSAccessKeyId出現不止一次,以第一次為準。
  4. 請求先驗證請求時間是否晚於Expires時間,然後再驗證簽名。
  5. 將簽名字符串放到url時,注意要對url進行urlencode
  • 時臨時用戶URL簽名時,需要攜帶 security-token,格式如下:
    1. https://oss-example.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?AccessKeyId=AccessKeyId&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D&security-token=SecurityToken

示例代碼

URL中添加簽名的python示例代碼:

  1. import base64
  2. import hmac
  3. import sha
  4. import urllib
  5. h = hmac.new("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV",
  6. "GETnnn1141889120n/oss-example/oss-api.pdf",
  7. sha)
  8. urllib.quote (base64.encodestring(h.digest()).strip())

提示:

  • 上麵為python的示例代碼
  • OSS SDK中提供了提供URL簽名的方法,使用方法請參看SDK文件中的 授權訪問章節 章節
  • OSS SDK的URL簽名實現,請參看下表
SDK URL簽名方法 實現文件
Java SDK OSSClient.generatePresignedUrl OSSClient.java
Python SDK Bucket.sign_url api.py
.Net SDK OssClient.GeneratePresignedUri OssClient.cs
PHP SDK OssClient.signUrl OssClient.php
JavaScript SDK signatureUrl object.js
C SDK oss_gen_signed_url oss_object.c

細節分析

  1. 使用在URL中簽名的方式,會將你授權的數據在過期時間以內曝露在互聯網上,請預先評估使用風險。
  2. PUT和GET請求都支持在URL中簽名。
  3. 在URL中添加簽名時,Signature,Expires,AccessKeyId順序可以交換,但是如果Signature,Expires,AccessKeyId缺少其中的一個或者多個,返回403 Forbidden。錯誤碼:AccessDenied。
  4. 如果訪問的當前時間晚於請求中設定的Expires時間,返回403 Forbidden。錯誤碼:AccessDenied。
  5. 如果Expires時間格式錯誤,返回403 Forbidden。錯誤碼:AccessDenied。
  6. 如果URL中包含參數Signature,Expires,AccessKeyId中的一個或者多個,並且Head中也包含簽名消息,返回消息400 Bad Request。錯誤碼:InvalidArgument。
  7. 生成簽名字符串時,除Date被替換成Expires參數外,仍然包含content-type、content-md5等上節中定義的Header。(請求中雖然仍然有Date這個請求頭,但不需要將Date加入簽名字符串中)

最後更新:2016-12-12 15:02:18

  上一篇:go 在Header中包含簽名__訪問控製_API 參考_對象存儲 OSS-阿裏雲
  下一篇:go 臨時授權訪問__訪問控製_API 參考_對象存儲 OSS-阿裏雲