全部產品
Search
文件中心

ApsaraVideo VOD:擷取STS臨時Token

更新時間:Jul 13, 2024

從用戶端直接上傳檔案到點播儲存(基於OSS)前,需要先擷取STS臨時Token。本文介紹在用戶端上傳情境下如何擷取STS臨時Token,為初始化上傳執行個體作準備。

背景資訊

目前用戶端上傳SDK支援兩種授權方式:

  • 使用上傳地址和憑證授權。

  • 使用STS方式授權。

阿里雲臨時安全性權杖STS(Security Token Service)是阿里雲通用的鑒權方式。在用戶端通過STS方式上傳,上傳SDK內部會封裝所有上傳的細節,您只需要關注STS的擷取、到期重新整理以及檔案上傳完成的回調即可。關於如何選擇上傳憑證方式與STS方式授權,請參見憑證方式與STS方式對比。如需使用上傳地址和憑證方式,請參見擷取上傳地址和憑證

上傳流程

使用STS方式上傳的完整的流程如下圖所示:用戶端STS方式上傳流程

  1. 使用者在上傳應用伺服器部署授權服務(如整合阿里雲STS SDK)用於擷取STS臨時Token。

  2. 用戶端向上傳應用伺服器發起請求擷取STS臨時Token。

  3. 上傳應用伺服器向阿里雲STS服務發起請求擷取STS臨時Token。

  4. 阿里雲STS服務返回上傳地址和憑證。

  5. 上傳應用伺服器向用戶端下發STS臨時Token。

  6. 用戶端使用STS臨時Token初始化上傳執行個體。

  7. 用戶端構造請求發起上傳請求。

  8. OSS服務返回上傳結果。

    說明

    上傳結果也可以通過提前配置回調接收上傳相關事件來監聽。

擷取STS臨時Token

為免去自行簽名等麻煩,建議整合STS SDK並通過SDK調用AssumeRole來擷取STS臨時Token。整合STS SDK前必須建立RAM使用者,RAM使用者角色並為角色授權訪問點播服務。

  1. 建立RAM使用者。操作指引請參見使用STS臨時授權方案上傳視頻

  2. (可選)如需自訂授權,請參見基於RAM Policy實現自訂授權

  3. 整合STS SDK並通過SDK調用AssumeRole來擷取STS臨時Token。操作步驟根據使用的語言不同而不同。

    服務端語言

    操作指引

    Java

    Java樣本

    說明

    下文提供了Java語言的範例程式碼詳解。

    Python

    Python樣本

    PHP

    PHP樣本

    .NET

    .NET樣本

    Node.js

    Node.js樣本

    Go

    Go樣本

Java樣本

Java擷取STS臨時Token範例程式碼

說明

此處以整合3.1.1版本的原版STS SDK為例進行擷取STS臨時Token樣本說明,如需整合其餘版本的STS SDK,詳細資料,請參見STS SDK概覽

  1. 整合STS SDK。

    添加STS SDK依賴。

    <dependencies>
      <!--  原版 SDK  -->
      <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-sts</artifactId>
        <version>3.1.1</version>
      </dependency>
    </dependencies>

    添加核心庫SDK Core依賴。

    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-core</artifactId>
      <version>4.6.1</version>
    </dependency>
  2. 調用AssumeRole擷取STS臨時Token。

    展開查看代碼

    
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.http.MethodType;
    import com.aliyuncs.profile.DefaultProfile;
    import com.aliyuncs.profile.IClientProfile;
    import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
    import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
    
    
    /**
     * @author jack
     * @date 2020/5/25
     */
    public class TestStsService {
    
        public static void main(String[] args) {
            // 只有RAM使用者(子帳號)才能調用 AssumeRole 介面
            // 阿里雲主帳號的AccessKeys不能用於發起AssumeRole請求
            // 請首先在RAM控制台建立一個RAM使用者,並為這個使用者建立AccessKeys
            // 請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
            String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
            String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            // AssumeRole API 請求參數: RoleArn, RoleSessionName, Policy, and DurationSeconds
            // RoleArn 需要在 RAM 控制台上擷取
            String roleArn = "acs:ram::174809843091****:role/vodrole";
            // RoleSessionName 角色會話名稱,自訂參數
            String roleSessionName = "session-name";// 自訂即可
            // 定製你的policy
            String policy = "{\n" +
                    "  \"Version\": \"1\",\n" +
                    "  \"Statement\": [\n" +
                    "    {\n" +
                    "      \"Action\": \"vod:*\",\n" +
                    "      \"Resource\": \"*\",\n" +
                    "      \"Effect\": \"Allow\"\n" +
                    "    }\n" +
                    "  ]\n" +
                    "}";
            try {
                AssumeRoleResponse response = assumeRole(accessKeyId, accessKeySecret, roleArn, roleSessionName, policy);
                System.out.println("Expiration: " + response.getCredentials().getExpiration());
                System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
                System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
                System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
                System.out.println("RequestId: " + response.getRequestId());
    
                createUploadVideo(response.getCredentials().getAccessKeyId(), response.getCredentials().getAccessKeySecret(), response.getCredentials().getSecurityToken());
            } catch (ClientException e) {
                System.out.println("Failed to get a token.");
                System.out.println("Error code: " + e.getErrCode());
                System.out.println("Error message: " + e.getErrMsg());
            }
        }
    
        static AssumeRoleResponse assumeRole(String accessKeyId, String accessKeySecret, String roleArn, String roleSessionName, String policy) throws ClientException {
            try {
                //構造default profile(參數留空,無需添加Region ID)
                /*
                說明:當設定SysEndpoint為sts.aliyuncs.com時,regionId可填可不填;反之,regionId必填,根據使用的服務地區填寫,例如:cn-shanghai
                詳情參考STS各地區的Endpoint,請參見接入地址。
                 */
                IClientProfile profile = DefaultProfile.getProfile("", accessKeyId, accessKeySecret);
                //用profile構造client
                DefaultAcsClient client = new DefaultAcsClient(profile);
                // 建立一個 AssumeRoleRequest 並佈建要求參數
                final AssumeRoleRequest request = new AssumeRoleRequest();
                request.setSysEndpoint("sts.aliyuncs.com");
                request.setSysMethod(MethodType.POST);
                request.setRoleArn(roleArn);
                request.setRoleSessionName(roleSessionName);
                request.setPolicy(policy);
                // 發起請求,並得到response
                final AssumeRoleResponse response = client.getAcsResponse(request);
                return response;
            } catch (ClientException e) {
                throw e;
            }
        }
                    

    參數

    描述

    RoleArn

    需要扮演的角色ID。為RAM使用者建立好角色後,角色的ID可以從RAM控制台擷取。擷取路徑:控制台的身份管理 > 角色,單擊角色名稱後,在基本資料中可以複製ARN。

    RoleSessionName

    角色會話名稱。該參數為使用者自訂參數。通常設定為調用該API的使用者身份,例如:使用者名稱。在Action Trail日誌中,即使是同一個RAM角色執行的操作,也可以根據不同的RoleSessionName來區分實際操作者,以實現使用者層級的訪問審計。長度為2~64個字元,可包含英文字母、數字、半形句號(.)、at(@)、短劃線(-)和底線(_)。

    Policy

    在扮演角色的時候額外加上一個許可權限制。

    說明
    • Policy是用來限制扮演角色之後的臨時憑證的許可權。最後臨時憑證獲得的許可權是角色的許可權和這裡傳入的Policy的交集。

    • 在扮演角色的時候傳入Policy的原因是為了靈活性,比如只能使用CreateUploadVideo介面。

    DurationSeconds

    臨時憑證的有效期間,單位為秒,最小為900,最大為3600。

    accessKeyId和accessKeySecret

    需要扮演角色的RAM使用者,及其AccessKey Secret。

使用STS臨時Token上傳

STS臨時Token與每個檔案一一對應,因此需要在開始上傳的回調裡,去使用者應用伺服器擷取STS臨時Token並設定給對應的上傳執行個體。具體設定因用戶端不同而不同。

用戶端

使用指引

Web

使用JavaScript SDK上傳檔案

Android

Android端檔案上傳

iOS

使用iOS SDK上傳檔案

微信小程式

使用微信小程式上傳SDK