文档

使用STS临时访问凭证调用虚拟数字人服务

更新时间:

本文为您介绍大屏应用如何安全使用虚拟数字人端渲染服务。为了避免在客户端应用中保存固定AccessKey ID和AccessKey Secret可能引起的泄漏风险,推荐您通过以下方案,更加安全地使用虚拟数字人服务。

前提条件

已确保当前账号为阿里云主账号或者被授予AliyunRAMFullAccess权限的RAM用户。关于为RAM用户授权的具体步骤,请参见为RAM用户授权。

适用场景

如果您作为客户端应用开发者,希望您的用户调用阿里云虚拟数字人端渲染服务时,避免在客户端应用中保存固定AccessKey ID和AccessKey Secret可能引起的泄漏风险,您可以使用STS授权用户调用服务。

交互流程

使用STS临时访问凭证授权用户调用虚拟数字人的交互流程如下:

image.svg

  1. 客户端应用向用户应用服务器请求STS临时访问凭证,此处使用用户自有的通信协议即可,比如用户登录时自动请求或服务端自动下发,或定时向应用服务器发起请求。

  2. 用户应用服务器向阿里云STS服务发起STS请求,此处请使用阿里云SDK,根据应用服务器自身保存的固定AK向STS请求生成一个临时凭证。

  3. STS返回给应用服务器一个临时访问凭证,包括临时访问密钥(AccessKey ID和AccessKey Secret)、安全令牌(SecurityToken)、该凭证的过期时间等信息。

  4. 用户应用服务器将临时凭证返回给客户端,此时客户端可以缓存并使用该凭证,直到凭证失效。当凭证失效时,客户端需要向应用服务器申请新的临时访问凭证。假设临时访问凭证有效期为1小时,客户端可以每30分钟或者每50分钟的频率向应用服务器请求更新临时访问凭证。

  5. 客户端使用获取到的临时凭证构建请求,向阿里云虚拟数字人公共云发起API调用,更多信息,请参见相关开发文档。

操作步骤

步骤一:创建RAM用户

1登录RAM控制台。 2在左侧导航栏,选择身份管理 > 用户。 3单击创建用户。 4输入登录名称显示名称。 5在访问方式区域下,选择Open API 调用访问,然后单击确定返回

image.png

6单击复制,保存访问密钥(AccessKey ID 和 AccessKey Secret)。 注意:若仅开通 OpenAPI 调用访问,请及时保存 AccessKey 信息,页面关闭后将无法再次获取信息。

image.png

步骤二:为RAM用户授予请求AssumeRole的权限

  1. 在左侧导航栏,选择身份管理 > 用户,在已创建的RAM用户右侧,单击对应的添加权限

  2. 在添加权限页面,选择AliyunSTSAssumeRoleAccess系统策略。

image.png

  1. 单击确定

步骤三:创建用于获取临时访问凭证的角色

  1. 在左侧导航栏,选择身份管理 > 角色

  2. 单击创建角色,可信实体类型选择阿里云账号,单击下一步

  3. 填写角色名称(此处以stsrole为例),选择当前云账号

image.png

  1. 单击完成。完成角色创建后,单击关闭

  2. 在RAM角色管理页面,搜索框输入角色名称stsrole。

  3. 单击复制,保存角色的ARN。

信任策略管理

image.png

步骤四:为角色授予访问虚拟数字人服务接口的权限

  1. 在角色信息页面,点击权限管理 > 新增授权。

  2. 在搜索栏中输入 AliyunAvatarFullAccess 并点选,在右侧已选择窗口中显示。 ALIYUNAVATARFULLACCESS

image.png

  1. 点击确定

步骤五:服务端获取STS临时访问凭证

需要注意,此步骤并不是在客户端侧调用的,您可以在自己的应用服务器侧,通过您持有的固定AccessKey ID和AccessKey Secret(即步骤一:创建RAM用户创建RAM用户时保存的账户信息)创建STS临时访问凭证,然后将该凭证(包括临时的AccessKeyId、AccessKeySecret和SecurityToken)通过您已有的交互链路返回给客户端侧,以进行SDK的接口调用,详见SDK API文档。

  • 方式一:使用阿里云SDK(推荐)您可以使用STS SDK概览获取临时访问凭证。以下Java代码用于获取临时访问凭证。引入POM依赖:

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>4.5.6</version>
</dependency>
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-sts</artifactId>
  <version>3.0.0</version>
</dependency>

完整示例代码如下:

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;

public class CreateStsCredentialsDemo {

    public static void main(String args[]) throws ClientException {
        //同region STS的OpenAPI地址
        String endpoint = "sts.aliyuncs.com";

        // 填写步骤一生成的访问密钥AccessKey ID和AccessKey Secret。
        String accessKeyId = "******";
        String accessKeySecret = "******";

        // 填写步骤三获取的角色ARN, 一般是: acs:ram::********:role/***
        String roleArn = "******";

        // 自定义角色会话名称,用来区分不同的令牌,例如可填写为nls-role-session-99。
        String roleSession = "nls-role-session-99";

        // 添加endpoint(直接使用STS endpoint,前两个参数留空,无需添加region ID)
        DefaultProfile.addEndpoint("", "Sts", endpoint);
        // 构造default profile(参数留空,无需添加region ID)
        IClientProfile profile = DefaultProfile.getProfile("", accessKeyId, accessKeySecret);
        // 用profile构造client
        DefaultAcsClient client = new DefaultAcsClient(profile);
        final AssumeRoleRequest request = new AssumeRoleRequest();
        request.setRoleArn(roleArn);
        request.setRoleSessionName(roleSession);
        final AssumeRoleResponse response = client.getAcsResponse(request);

        String stsAccessKeyId = response.getCredentials().getAccessKeyId();
        String stsAccessKeySecret = response.getCredentials().getAccessKeySecret();
        String stsToken = response.getCredentials().getSecurityToken();

        System.out.println("Expiration: " + response.getCredentials().getExpiration());
        System.out.println("Access Key Id: " + stsAccessKeyId);
        System.out.println("Access Key Secret: " + stsAccessKeySecret);
        System.out.println("Security Token: " + stsToken);
        System.out.println("RequestId: " + response.getRequestId());
    }
}

  • 方式二:使用REST API

您可以通过调用STS服务接口AssumeRole获取临时访问凭证。

  • 本页导读 (0)
文档反馈