全部產品
Search
文件中心

ApsaraVideo VOD:STS臨時Token

更新時間:Jul 13, 2024

STS(Security Token Service)是為阿里雲帳號(或RAM使用者)提供短期存取權限管理的雲端服務。除了通過上傳地址和憑證上傳外,ApsaraVideo for VOD的部分開發人員上傳方式還支援使用STS臨時Token訪問點播服務。本文介紹STS臨時Token的技術原理、使用說明及擷取方式。

技術原理

通過STS為第三方訪問頒發一個自訂時效和存取權限的訪問憑證(STS臨時Token)。第三方使用者可以使用STS臨時Token直接調用點播服務端API。

使用說明

說明 使用STS臨時Token方式和使用上傳地址和憑證方式各有優勢。使用者需要根據實際需求選擇使用。兩種方式詳細的對比請參見憑證方式與STS方式對比。更多關於上傳地址和憑證的資訊請參見上傳地址和憑證
在上傳情境下,使用STS臨時Token和使用上傳地址和憑證的操作區別是:
  • 使用STS臨時Token需要在構造上傳請求時傳入提前擷取到的STS臨時Token和臨時AK對。
  • 使用上傳地址和憑證在構造上傳請求時可直接傳入阿里雲帳號或RAM使用者的AK對。
不同的上傳方式使用STS臨時Token的描述如下:
上傳方式是否支援STS臨時Token擷取/使用方式

上傳SDK(服務端)

僅Java語言支援

擷取STS臨時Token的方式請參見擷取STS臨時Token

STS臨時Token在上傳情境下的具體應用請參見各上傳方式對應的操作文檔。

上傳SDK(用戶端)

支援

URL批量拉取上傳

不涉及

基於OSS原生SDK上傳

通過OSS原生SDK調用OSS服務上傳時必須使用STS方式。

基於OSS API上傳

不涉及

擷取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。