從用戶端直接上傳檔案到點播儲存(基於OSS)前,需要先擷取STS臨時Token。本文介紹在用戶端上傳情境下如何擷取STS臨時Token,為初始化上傳執行個體作準備。
背景資訊
阿里雲臨時安全性權杖STS(Security Token Service)是阿里雲通用的鑒權方式。在用戶端通過STS方式上傳,上傳SDK內部會封裝所有上傳的細節,您只需要關注STS的擷取、到期重新整理以及檔案上傳完成的回調即可。關於如何選擇上傳憑證方式與STS方式授權,請參見憑證方式與STS方式對比。如需使用上傳地址和憑證方式,請參見擷取上傳地址和憑證。
上傳流程
使用STS方式上傳的完整的流程如下圖所示:
使用者在上傳應用伺服器部署授權服務(如整合阿里雲STS SDK)用於擷取STS臨時Token。
用戶端向上傳應用伺服器發起請求擷取STS臨時Token。
上傳應用伺服器向阿里雲STS服務發起請求擷取STS臨時Token。
阿里雲STS服務返回上傳地址和憑證。
上傳應用伺服器向用戶端下發STS臨時Token。
用戶端使用STS臨時Token初始化上傳執行個體。
用戶端構造請求發起上傳請求。
OSS服務返回上傳結果。
說明 上傳結果也可以通過提前配置回調接收上傳相關事件來監聽。
擷取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。 |
使用STS臨時Token上傳
STS臨時Token與每個檔案一一對應,因此需要在開始上傳的回調裡,去使用者應用伺服器擷取STS臨時Token並設定給對應的上傳執行個體。具體設定因用戶端不同而不同。