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
為免去自行簽名等麻煩,建議整合STS SDK並通過SDK調用AssumeRole來擷取STS臨時Token。整合STS SDK前必須建立RAM使用者,RAM使用者角色並為角色授權訪問點播服務。
建立RAM使用者。操作指引請參見使用STS臨時授權方案上傳視頻。
(可選)如需自訂授權,請參見基於RAM Policy實現自訂授權。
整合STS SDK並通過SDK調用AssumeRole來擷取STS臨時Token。操作步驟根據使用的語言不同而不同。
Java樣本
Java擷取STS臨時Token範例程式碼
說明 此處以整合3.1.1版本的原版STS SDK為例進行擷取STS臨時Token樣本說明,如需整合其餘版本的STS SDK,詳細資料,請參見STS SDK概覽。
整合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>
調用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 | 在扮演角色的時候額外加上一個許可權限制。 |
DurationSeconds | 臨時憑證的有效期間,單位為秒,最小為900,最大為3600。 |
accessKeyId和accessKeySecret | 需要扮演角色的RAM使用者,及其AccessKey Secret。 |