本文介绍在客户端上传SDK场景下如何STS临时Token,为初始化上传实例作准备。

背景信息

在客户端上传媒体文件时,会直接将文件上传到点播存储(基于OSS),不会再经服务端进行中转,故客户端上传必须进行鉴权,也就是需要您在应用服务器上部署授权服务以获取上传地址和凭证。目前客户端上传SDK支持两种授权方式:
  • 使用上传地址和凭证授权。
  • 使用STS方式授权。

阿里云临时安全令牌STS(Security Token Service)是阿里云通用的鉴权方式。在客户端通过STS方式上传,上传SDK内部会封装所有上传的细节,您只需要关注STS的获取、过期刷新以及文件上传完成的回调即可。关于如何选择上传凭证方式与STS方式授权,请参见凭证方式与STS方式对比。如需使用上传地址和凭证方式,请参见获取上传地址和凭证

上传流程

使用STS临时Token上传的详细流程请参见上传流程

获取STS临时Token

为免去自行签名等麻烦,建议集成STS SDK并通过SDK调用AssumeRole来获取STS临时Token。集成STS SDK前必须创建RAM用户,RAM用户角色并为角色授权访问点播服务。

  1. 创建RAM用户。操作指引请参见创建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示例代码

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
        String accessKeyId = "LTAI5tKtf6vKccbinQu****";
        String accessKeySecret = "D47l1yBPgjdqe3JzVASSF9yrje****";
        // AssumeRole API 请求参数: RoleArn, RoleSessionName, Policy, and DurationSeconds
        // RoleArn 需要在 RAM 控制台上获取
        String roleArn = "acs:ram::1748098430911242: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的用户身份,例如:用户名。在操作审计日志中,即使是同一个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 Web(JavaScript)上传SDK
Android Android端文件上传
iOS 文件上传
微信小程序 微信小程序上传SDK