全部產品
Search
文件中心

Object Storage Service:Ruby授權訪問

更新時間:Jun 08, 2024

本文介紹如何使用STS以及簽名URL臨時授權訪問OSS資源。

注意事項

  • 由於STS臨時帳號以及簽名URL均需設定有效時間長度,當您使用STS臨時帳號產生簽名URL執行相關操作(例如上傳、下載檔案)時,以最小的有效時間長度為準。例如您的STS臨時帳號的有效時間長度設定為1200秒、簽名URL設定為3600秒時,當有效時間長度超過1200秒後,您無法使用此STS臨時帳號產生的簽名URL上傳檔案。

  • 本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見訪問網域名稱和資料中心

  • 本文以OSS網域名稱建立Client為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化Client

使用STS進行臨時授權

OSS可以通過阿里雲STS(Security Token Service)進行臨時授權訪問。阿里雲STS是為雲端運算使用者提供臨時存取權杖的Web服務。通過STS,您可以為第三方應用或子使用者(即使用者身份由您自己管理的使用者)頒發一個自訂時效和許可權的訪問憑證。關於STS的更多資訊,請參見STS介紹

STS的優勢如下:

  • 您無需透露您的長期密鑰(AccessKey)給第三方應用,只需產生一個存取權杖並將令牌交給第三方應用。您可以自訂這個令牌的存取權限及有效期間限。

  • 您無需關心許可權撤銷問題,存取權杖到期後自動失效。

通過STS臨時授權訪問OSS的步驟如下:

  1. 擷取臨時訪問憑證

    臨時訪問憑證包括臨時存取金鑰(AccessKey ID和AccessKey Secret)和安全性權杖(SecurityToken)。臨時訪問憑證有效時間單位為秒,最小值為900,最大值以當前角色設定的最大會話時間為準。更多資訊,請參見設定RAM角色最大會話時間

    您可以通過以下兩種方式擷取臨時訪問憑證。

    • 方式一

      通過調用STS服務的AssumeRole介面擷取臨時訪問憑證。

    • 方式二

      通過各語言STS SDK擷取臨時訪問憑證。

  2. 使用STS臨時訪問憑證上傳檔案。

require 'aliyun/sts'
require 'aliyun/oss'

sts = Aliyun::STS::Client.new(  。
  # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  access_key_id: ENV['OSS_ACCESS_KEY_ID'],
  access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# 依次填寫角色ARN並自訂角色會話名稱。
token = sts.assume_role('role-arn', 'session-name')

client = Aliyun::OSS::Client.new(
  # Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
  endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
  # 從STS服務擷取的臨時存取金鑰(AccessKey ID和AccessKey Secret)。
  access_key_id: 'token.access_key_id',
  access_key_secret: 'token.access_key_secret',
  # 從STS服務擷取的安全性權杖(SecurityToken)。
  sts_token: 'token.security_token')

# 填寫Bucket名稱,例如examplebucket。
bucket = client.get_bucket('examplebucket')
# 上傳檔案。
bucket.put_object('exampleobject.txt', :file => 'D:\\localpath\\examplefile.txt')

使用簽名URL進行臨時授權

注意事項

  • 產生簽名URL過程中,SDK利用本機存放區的密鑰資訊,根據特定演算法計算出簽名(signature),然後將其附加到URL上,以確保URL的有效性和安全性。這一系列計算和構造URL的操作都是在用戶端完成,不涉及網路請求到服務端。因此,產生簽名URL時不需要授予調用者特定許可權。但是,為避免第三方使用者無法對簽名URL授權的資源執行相關操作,需要確保調用產生簽名URL介面的身份主體被授予對應的許可權。

    例如,通過簽名URL下載或預覽檔案時,需要授予oss:GetObject許可權。

  • 您可以將產生的簽名URL提供給訪客進行臨時訪問。產生簽名URL時,您可以自訂URL的到期時間來限制訪客的訪問時間長度。

  • 如果需要產生HTTPS協議的簽名URL,請將Endpoint中的通訊協定設定為HTTPS。

  • 通過以下樣本產生的簽名URL中如果包含特殊符號+,可能出現無法正常訪問該簽名URL的現象。如需正常訪問該簽名URL,請將簽名URL中的+替換為%2B

產生簽名URL並通過簽名URL下載檔案

  1. 產生用於下載的簽名URL。

    require 'aliyun/oss'
    
    client = Aliyun::OSS::Client.new(
      # Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
      endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
      # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
      access_key_id: ENV['OSS_ACCESS_KEY_ID'],
      access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
    )
    # 填寫Bucket名稱,例如examplebucket。
    bucket = client.get_bucket('examplebucket')
    
    # 產生簽名URL,並指定URL有效時間為1小時(3600秒)。
    puts bucket.object_url('my-object', true, 3600)
  2. 在移動端或者瀏覽器端通過簽名URL下載檔案。
    // 填寫產生的簽名URL。
    String url = "";
    OkHttpClient client = new OkHttpClient();
    // 通過簽名URL下載檔案。
    Request getRequest = new Request.Builder()
            .url(url)
            .get()
            .build();
    client.newCall(getRequest).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }
    
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.code() == 203 || response.code() >= 300) {
                Log.d("download", "fail");
                Log.d("download", response.body().string());
                return;
            }
            // 請求成功。
            InputStream inputStream = response.body().byteStream();
    
            byte[] buffer = new byte[2048];
            int len;
    
            while ((len = inputStream.read(buffer)) != -1) {
                // 處理下載的資料,例如圖片展示或者寫入檔案等。
            }
        }
    });
    // 使用簽名URL下載檔案。
    NSURL * url = [NSURL URLWithString:urlString];
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    NSURLSession * session = [NSURLSession sharedSession];
    NSURLSessionTask * sessionTask = [session dataTaskWithRequest:request
                                                completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error) {
            NSLog(@"download error: %@", error);
            return;
        } else if (((NSHTTPURLResponse*)response).statusCode == 203 ||
                   ((NSHTTPURLResponse*)response).statusCode >= 300) {
            NSString *body = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"download error: %@", body);
            return;
        }
        NSLog(@"download success");
    }];
    [sessionTask resume];
    // 通過HTML中<a>標籤的download屬性、Web API中的window.open等方式使用擷取的檔案URL。

相關文檔

  • 關於使用STS進行臨時授權詳細用法和參數說明,請參見API文檔

  • 關於在URL中加入簽名資訊,然後將簽名URL轉給第三方實現授權訪問的更多資訊,請參見簽名版本1