获取STS临时Token

从客户端直接上传文件到点播存储(基于OSS)前,需要先获取STS临时Token。本文介绍在客户端上传场景下如何获取STS临时Token,为初始化上传实例作准备。

背景信息

目前客户端上传SDK支持两种授权方式:

  • 使用上传地址和凭证授权。

  • 使用STS方式授权。

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

上传流程

使用STS方式上传的完整的流程如下图所示:客户端STS方式上传流程

  1. 用户在上传应用服务器上部署授权服务(如集成阿里云STS SDK)用于获取STS临时Token。

  2. 客户端向上传应用服务器发起请求获取STS临时Token。

  3. 上传应用服务器向阿里云STS服务发起请求获取STS临时Token。

  4. 阿里云STS服务返回上传地址和凭证。

  5. 上传应用服务器向客户端下发STS临时Token。

  6. 客户端使用STS临时Token初始化上传实例。

  7. 客户端构造请求发起上传请求。

  8. OSS服务返回上传结果。

    说明

    上传结果也可以通过提前配置回调接收上传相关事件来监听。

获取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的用户身份,例如:用户名。在操作审计日志中,即使是同一个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

使用JavaScript SDK上传媒体文件

Android

Android端文件上传

iOS

文件上传

微信小程序

微信小程序上传SDK