STS临时Token

更新时间:2025-03-27 05:25:49

STS(Security Token Service)是为阿里云账号(或RAM用户)提供短期访问权限管理的云服务。除了通过上传地址和凭证上传外,视频点播的部分开发者上传方式还支持使用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临时Token获取/使用方式

上传SDK(服务端)

Java语言支持

获取STS临时Token的方式请参见获取STS临时Token

STS临时Token在上传场景下的具体应用请参见各上传方式对应的操作文档。

上传SDK(客户端)

支持

URL批量拉取上传

不涉及

基于OSS原生SDK上传

通过OSS原生SDK调用OSS服务上传时必须使用STS方式。

基于OSS API上传

不涉及

获取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。

    accessKeyIdaccessKeySecret

    需要扮演角色的RAM用户,及其AccessKey Secret。

  • 本页导读 (1)
  • 技术原理
  • 使用说明
  • 获取STS临时Token
  • Java示例