背景信息
阿里云临时安全令牌STS(Security Token Service)是阿里云通用的鉴权方式。在客户端通过STS方式上传,上传SDK内部会封装所有上传的细节,您只需要关注STS的获取、过期刷新以及文件上传完成的回调即可。关于如何选择上传凭证方式与STS方式授权,请参见凭证方式与STS方式对比。如需使用上传地址和凭证方式,请参见获取上传地址和凭证。
上传流程
使用STS方式上传的完整的流程如下图所示:
用户在上传应用服务器上部署授权服务(如集成阿里云STS SDK)用于获取STS临时Token。
客户端向上传应用服务器发起请求获取STS临时Token。
上传应用服务器向阿里云STS服务发起请求获取STS临时Token。
阿里云STS服务返回上传地址和凭证。
上传应用服务器向客户端下发STS临时Token。
客户端使用STS临时Token初始化上传实例。
客户端构造请求发起上传请求。
OSS服务返回上传结果。
说明 上传结果也可以通过提前配置回调接收上传相关事件来监听。
获取STS临时Token
为免去自行签名等麻烦,建议集成STS SDK并通过SDK调用AssumeRole来获取STS临时Token。集成STS SDK前必须创建RAM用户,RAM用户角色并为角色授权访问点播服务。
创建RAM用户。操作指引请参见使用STS临时授权方案上传视频。
(可选)如需自定义授权,请参见基于RAM Policy实现自定义授权。
集成STS SDK并通过SDK调用AssumeRole来获取STS临时Token。操作步骤根据使用的语言不同而不同。
Java示例
Java获取STS临时Token示例代码
说明 此处以集成3.1.1版本的原版STS SDK为例进行获取STS临时Token示例说明,如需集成其余版本的STS SDK,详细信息,请参见STS SDK概览。
集成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>
调用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 | 在扮演角色的时候额外加上一个权限限制。 |
DurationSeconds | 临时凭证的有效期,单位为秒,最小为900,最大为3600。 |
accessKeyId和accessKeySecret | 需要扮演角色的RAM用户,及其AccessKey Secret。 |
使用STS临时Token上传
STS临时Token与每个文件一一对应,因此需要在开始上传的回调里,去用户应用服务器获取STS临时Token并设置给对应的上传实例。具体设置因客户端不同而不同。