獲取STS臨時(shí)Token
從客戶端直接上傳文件到點(diǎn)播存儲(chǔ)(基于OSS)前,需要先獲取STS臨時(shí)Token。本文介紹在客戶端上傳場景下如何獲取STS臨時(shí)Token,為初始化上傳實(shí)例作準(zhǔn)備。
背景信息
目前客戶端上傳SDK支持兩種授權(quán)方式:
使用上傳地址和憑證授權(quán)。
使用STS方式授權(quán)。
阿里云臨時(shí)安全令牌STS(Security Token Service)是阿里云通用的鑒權(quán)方式。在客戶端通過STS方式上傳,上傳SDK內(nèi)部會(huì)封裝所有上傳的細(xì)節(jié),您只需要關(guān)注STS的獲取、過期刷新以及文件上傳完成的回調(diào)即可。關(guān)于如何選擇上傳憑證方式與STS方式授權(quán),請(qǐng)參見憑證方式與STS方式對(duì)比。如需使用上傳地址和憑證方式,請(qǐng)參見獲取上傳地址和憑證。
上傳流程
使用STS方式上傳的完整的流程如下圖所示:
用戶在上傳應(yīng)用服務(wù)器上部署授權(quán)服務(wù)(如集成阿里云STS SDK)用于獲取STS臨時(shí)Token。
客戶端向上傳應(yīng)用服務(wù)器發(fā)起請(qǐng)求獲取STS臨時(shí)Token。
上傳應(yīng)用服務(wù)器向阿里云STS服務(wù)發(fā)起請(qǐng)求獲取STS臨時(shí)Token。
阿里云STS服務(wù)返回上傳地址和憑證。
上傳應(yīng)用服務(wù)器向客戶端下發(fā)STS臨時(shí)Token。
客戶端使用STS臨時(shí)Token初始化上傳實(shí)例。
客戶端構(gòu)造請(qǐng)求發(fā)起上傳請(qǐng)求。
OSS服務(wù)返回上傳結(jié)果。
說明上傳結(jié)果也可以通過提前配置回調(diào)接收上傳相關(guān)事件來監(jiān)聽。
獲取STS臨時(shí)Token
為免去自行簽名等麻煩,建議集成STS SDK并通過SDK調(diào)用AssumeRole來獲取STS臨時(shí)Token。集成STS SDK前必須創(chuàng)建RAM用戶,RAM用戶角色并為角色授權(quán)訪問點(diǎn)播服務(wù)。
創(chuàng)建RAM用戶。操作指引請(qǐng)參見使用STS臨時(shí)授權(quán)方案上傳視頻。
(可選)如需自定義授權(quán),請(qǐng)參見基于RAM Policy實(shí)現(xiàn)自定義授權(quán)。
集成STS SDK并通過SDK調(diào)用AssumeRole來獲取STS臨時(shí)Token。操作步驟根據(jù)使用的語言不同而不同。
Java示例
Java獲取STS臨時(shí)Token示例代碼
此處以集成3.1.1版本的原版STS SDK為例進(jìn)行獲取STS臨時(shí)Token示例說明,如需集成其余版本的STS SDK,詳細(xì)信息,請(qǐng)參見STS SDK概覽。
集成STS SDK。
調(diào)用AssumeRole獲取STS臨時(shí)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用戶(子賬號(hào))才能調(diào)用 AssumeRole 接口 // 阿里云主賬號(hào)的AccessKeys不能用于發(fā)起AssumeRole請(qǐng)求 // 請(qǐng)首先在RAM控制臺(tái)創(chuàng)建一個(gè)RAM用戶,并為這個(gè)用戶創(chuàng)建AccessKeys // 請(qǐng)確保代碼運(yùn)行環(huán)境設(shè)置了環(huán)境變量 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 請(qǐng)求參數(shù): RoleArn, RoleSessionName, Policy, and DurationSeconds // RoleArn 需要在 RAM 控制臺(tái)上獲取 String roleArn = "acs:ram::174809843091****:role/vodrole"; // RoleSessionName 角色會(huì)話名稱,自定義參數(shù) 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 { //構(gòu)造default profile(參數(shù)留空,無需添加Region ID) /* 說明:當(dāng)設(shè)置SysEndpoint為sts.aliyuncs.com時(shí),regionId可填可不填;反之,regionId必填,根據(jù)使用的服務(wù)區(qū)域填寫,例如:cn-shanghai 詳情參考STS各地域的Endpoint,請(qǐng)參見接入地址。 */ IClientProfile profile = DefaultProfile.getProfile("", accessKeyId, accessKeySecret); //用profile構(gòu)造client DefaultAcsClient client = new DefaultAcsClient(profile); // 創(chuàng)建一個(gè) AssumeRoleRequest 并設(shè)置請(qǐng)求參數(shù) final AssumeRoleRequest request = new AssumeRoleRequest(); request.setSysEndpoint("sts.aliyuncs.com"); request.setSysMethod(MethodType.POST); request.setRoleArn(roleArn); request.setRoleSessionName(roleSessionName); request.setPolicy(policy); // 發(fā)起請(qǐng)求,并得到response final AssumeRoleResponse response = client.getAcsResponse(request); return response; } catch (ClientException e) { throw e; } }
參數(shù)
描述
RoleArn
需要扮演的角色I(xiàn)D。為RAM用戶創(chuàng)建好角色后,角色的ID可以從RAM控制臺(tái)獲取。獲取路徑:控制臺(tái)的
,單擊角色名稱后,在基本信息中可以復(fù)制ARN。RoleSessionName
角色會(huì)話名稱。該參數(shù)為用戶自定義參數(shù)。通常設(shè)置為調(diào)用該API的用戶身份,例如:用戶名。在操作審計(jì)日志中,即使是同一個(gè)RAM角色執(zhí)行的操作,也可以根據(jù)不同的RoleSessionName來區(qū)分實(shí)際操作者,以實(shí)現(xiàn)用戶級(jí)別的訪問審計(jì)。長度為2~64個(gè)字符,可包含英文字母、數(shù)字、半角句號(hào)(.)、at(@)、短劃線(-)和下劃線(_)。
Policy
在扮演角色的時(shí)候額外加上一個(gè)權(quán)限限制。
說明Policy是用來限制扮演角色之后的臨時(shí)憑證的權(quán)限。最后臨時(shí)憑證獲得的權(quán)限是角色的權(quán)限和這里傳入的Policy的交集。
在扮演角色的時(shí)候傳入Policy的原因是為了靈活性,比如只能使用CreateUploadVideo接口。
DurationSeconds
臨時(shí)憑證的有效期,單位為秒,最小為900,最大為3600。
accessKeyId和accessKeySecret
需要扮演角色的RAM用戶,及其AccessKey Secret。
使用STS臨時(shí)Token上傳
STS臨時(shí)Token與每個(gè)文件一一對(duì)應(yīng),因此需要在開始上傳的回調(diào)里,去用戶應(yīng)用服務(wù)器獲取STS臨時(shí)Token并設(shè)置給對(duì)應(yīng)的上傳實(shí)例。具體設(shè)置因客戶端不同而不同。
客戶端 | 使用指引 |
Web | |
Android | |
iOS | |
微信小程序 |