本文为您介绍大屏应用如何安全使用虚拟数字人端渲染服务。为了避免在客户端应用中保存固定AccessKey ID和AccessKey Secret可能引起的泄漏风险,推荐您通过以下方案,更加安全地使用虚拟数字人服务。
前提条件
已确保当前账号为阿里云主账号或者被授予AliyunRAMFullAccess权限的RAM用户。关于为RAM用户授权的具体步骤,请参见为RAM用户授权。
适用场景
如果您作为客户端应用开发者,希望您的用户调用阿里云虚拟数字人端渲染服务时,避免在客户端应用中保存固定AccessKey ID和AccessKey Secret可能引起的泄漏风险,您可以使用STS授权用户调用服务。
交互流程
使用STS临时访问凭证授权用户调用虚拟数字人的交互流程如下:
客户端应用向用户应用服务器请求STS临时访问凭证,此处使用用户自有的通信协议即可,比如用户登录时自动请求或服务端自动下发,或定时向应用服务器发起请求。
用户应用服务器向阿里云STS服务发起STS请求,此处请使用阿里云SDK,根据应用服务器自身保存的固定AK向STS请求生成一个临时凭证。
STS返回给应用服务器一个临时访问凭证,包括临时访问密钥(AccessKey ID和AccessKey Secret)、安全令牌(SecurityToken)、该凭证的过期时间等信息。
用户应用服务器将临时凭证返回给客户端,此时客户端可以缓存并使用该凭证,直到凭证失效。当凭证失效时,客户端需要向应用服务器申请新的临时访问凭证。假设临时访问凭证有效期为1小时,客户端可以每30分钟或者每50分钟的频率向应用服务器请求更新临时访问凭证。
客户端使用获取到的临时凭证构建请求,向阿里云虚拟数字人公共云发起API调用,更多信息,请参见相关开发文档。
操作步骤
步骤一:创建RAM用户
1登录RAM控制台。 2在左侧导航栏,选择身份管理 > 用户。 3单击创建用户。 4输入登录名称和显示名称。 5在访问方式区域下,选择Open API 调用访问,然后单击确定。 返回

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

步骤二:为RAM用户授予请求AssumeRole的权限
在左侧导航栏,选择身份管理 > 用户,在已创建的RAM用户右侧,单击对应的添加权限。
在添加权限页面,选择AliyunSTSAssumeRoleAccess系统策略。

单击确定。
步骤三:创建用于获取临时访问凭证的角色
在左侧导航栏,选择身份管理 > 角色。
单击创建角色,可信实体类型选择阿里云账号,单击下一步。
填写角色名称(此处以stsrole为例),选择当前云账号。

单击完成。完成角色创建后,单击关闭。
在RAM角色管理页面,搜索框输入角色名称stsrole。
单击复制,保存角色的ARN。
信任策略管理

步骤四:为角色授予访问虚拟数字人服务接口的权限
在角色信息页面,点击权限管理 > 新增授权。
在搜索栏中输入 AliyunAvatarFullAccess 并点选,在右侧已选择窗口中显示。 ALIYUNAVATARFULLACCESS

点击确定。
步骤五:服务端获取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获取临时访问凭证。