一、临时密钥
·TmpSecretId
·TmpSecretKey
·Token
二、使用临时密钥的优势
Web、iOS、Android 使用 CI 时,通过固定密钥计算签名方式不能有效地控制权限,同时把永久密钥放到客户端代码中有极大的泄露风险。如若通过临时密钥方式,则可以方便、有效地解决权限控制问题。
例如,在申请临时密钥过程中,可以通过设置权限策略 policy 字段,限制操作和资源,将权限限制在指定的范围内。
有关 CI 的 API 授权策略,请参见:
·常见场景的临时密钥权限策略示例
·授权数据处理场景(数据万象)权限策略示例
三、获取临时密钥
获取临时密钥,可以通过提供的 COS STS SDK 方式获取,也可以直接请求 STS 云 API 的方式获取。
注意:举例使用的是 Java SDK ,需要在 GitHub 上获取 SDK 代码(版本号)。若提示找不到对应 SDK 版本号,请确认是否在 GitHub 上获取到对应版本的 SDK。
四、COS STS SDK
COS 针对 STS 提供了 SDK 和样例,目前已有 Java、Nodejs、PHP、Python、Go 等多种语言的样例。具体内容请参见 COS STS SDK。各个 SDK 的使用说明请参见 Github 上的 README 和样例。各语言 GitHub 地址如下表格所示:
| 语言类型 | 代码仓库说明 | 代码示例地址 |
| Java | 使用文档 | 示例地址 |
| .NET | 使用文档 | 示例地址 |
| Go | 使用文档 | 示例地址 |
| NodeJS | 使用文档 | 示例地址 |
| PHP | 使用文档 | 示例地址 |
| Python | 使用文档 | 示例地址 |
注意:STS SDK 为了屏蔽 STS 接口本身版本间的差异性,返回参数结构不一定与 STS 接口完全一致,详情请参见 Java SDK 文档。
假设你使用的是 Java SDK,请先下载 Java SDK,然后运行如下获取临时密钥示例:
五、代码示例
// 根据 github 提供的 maven 集成方法导入 java sts sdk,使用 3.1.1 及更高版本// <dependency>// <groupId>com.qcloud</groupId>// <artifactId>cos-sts_api</artifactId>// <version>3.1.1</version>// </dependency>
public static void main(String[] args) {
TreeMap<String, Object> config = new TreeMap<String, Object>();
try {
//这里的 SecretId 和 SecretKey 代表了用于申请临时密钥的永久身份(主账号、子账号等),子账号需要具有操作存储桶的权限。
String secretId = System.getenv("secretId");//用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
String secretKey = System.getenv("secretKey");//用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
// 替换为你的云 api 密钥 SecretId
config.put("secretId", secretId);
// 替换为你的云 api 密钥 SecretKey
config.put("secretKey", secretKey);
// 初始化 policy
Policy policy = new Policy();
// 设置域名:
// 如果你使用了腾讯云 cvm,可以设置内部域名
//config.put("host", "sts.internal.tencentcloudapi.com");
// 临时密钥有效时长,单位是秒,默认 1800 秒,目前主账号最长 2 小时(即 7200 秒),子账号最长 36 小时(即 129600)秒
config.put("durationSeconds", 1800);
// 换成你的 bucket
config.put("bucket", "examplebucket-1250000000");
// 换成 bucket 所在地区
config.put("region", "ap-chongqing");
// 开始构建一条 statement
Statement statement = new Statement();
// 声明设置的结果是允许操作
statement.setEffect("allow");
/**
* 密钥的权限列表。必须在这里指定本次临时密钥所需要的权限。
* 权限列表请参见 https://cloud.tencent.com/document/product/436/31923
* 规则为 {project}:{interfaceName}
* project : 产品缩写 cos相关授权为值为cos,数据万象(数据处理)相关授权值为ci
* 授权所有接口用*表示,例如 cos:*,ci:*
* 添加一批操作权限 :
*/
statement.addActions(new String[]{
// 创建媒体处理任务
"ci:CreateMediaJobs",
// 文件压缩
"ci:CreateFileProcessJobs", // cos资源上传 "cos:PutObject"
});
/**
* 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径
* 资源表达式规则分对象存储(cos)和数据万象(ci)两种
* 数据处理、审核相关接口需要授予ci资源权限
* cos : qcs::cos:{region}:uid/{appid}:{bucket}/{path}
* ci : qcs::ci:{region}:uid/{appid}:bucket/{bucket}/{path}
* 列举几种典型的{path}授权场景:
* 1、允许访问所有对象:"*"
* 2、允许访问指定的对象:"a/a1.txt", "b/b1.txt"
* 3、允许访问指定前缀的对象:"a*", "a/*", "b/*"
* 如果填写了“*”,将允许用户访问所有资源;除非业务需要,否则请按照最小权限原则授予用户相应的访问权限范围。
*
* 示例:授权examplebucket-1250000000 bucket目录下的所有资源给cos和ci 授权两条Resource
*/
statement.addResources(new String[]{
"qcs::cos:ap-chongqing:uid/1250000000:examplebucket-1250000000/*",
"qcs::ci:ap-chongqing:uid/1250000000:bucket/examplebucket-1250000000/*"});
// 把一条 statement 添加到 policy
// 可以添加多条
policy.addStatement(statement);
// 将 Policy 示例转化成 String,可以使用任何 json 转化方式,这里是本 SDK 自带的推荐方式
config.put("policy", Jackson.toJsonPrettyString(policy));
Response response = CosStsClient.getCredential(config);
System.out.println(response.credentials.tmpSecretId);
System.out.println(response.credentials.tmpSecretKey);
System.out.println(response.credentials.sessionToken);
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("no valid secret !");
}
}
六、JSONObject 包冲突导致 NoSuchMethodError?
使用3.1.1及以后的版本。
七、使用临时密钥访问 CI
CI API 使用临时密钥访问 CI 服务时,通过 x-cos-security-token 字段传递临时 sessionToken,通过临时 SecretId 和 SecretKey 计算签名。
以 COS Java SDK 为例,使用临时密钥访问万象文件处理接口示例如下:
注意:说明:
注意:运行如下示例前,请前往 Github 项目 获取 Java SDK 安装包。
// 根据 github 提供的 maven 集成方式导入 cos xml java sdkpublic static void main(String[] args) {
String tmpSecretId = "COS_SECRETID"; // 替换为 STS 接口返回给你的临时 SecretId
String tmpSecretKey = "COS_SECRETKEY"; // 替换为 STS 接口返回给你的临时 SecretKey
String sessionToken = "Token"; // 替换为 STS 接口返回给你的临时 Token
BasicSessionCredentials cred = new BasicSessionCredentials(tmpSecretId, tmpSecretKey, sessionToken);
// 2 设置 bucket 的地域
// clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分
Region region = new Region("ap-chongqing"); //COS_REGION 参数:配置成存储桶 bucket 的实际地域,例如 ap-beijing,更多 COS 地域的简称请参见 https://cloud.tencent.com/document/product/436/6224
ClientConfig clientConfig = new ClientConfig(region);
// 3 生成 cos 客户端
COSClient cosClient = new COSClient(cred, clientConfig);
//1.创建任务请求对象
FileProcessRequest request = new FileProcessRequest();
//2.添加请求参数 参数详情请见api接口文档
request.setBucketName("demo-1234567890");
request.setTag(FileProcessJobType.FileCompress);
FileCompressConfig fileCompressConfig = request.getOperation().getFileCompressConfig();
fileCompressConfig.setFormat("zip");
fileCompressConfig.setFlatten("0");
fileCompressConfig.setIgnoreError("true");
List<KeyConfig> keyConfigList = fileCompressConfig.getKeyConfigList();
KeyConfig keyConfig = new KeyConfig();
keyConfig.setKey("1.jpg");
keyConfig.setRename("rename-1.jpg");
keyConfigList.add(keyConfig);
MediaOutputObject output = request.getOperation().getOutput();
output.setBucket("demo-1234567890");
output.setRegion("ap-chongqing");
output.setObject("output/demo.zip");
//3.调用接口,获取任务响应对象
try {
FileProcessJobResponse response = cosClient.createFileProcessJob(request);
System.out.println(response);
} catch (CosServiceException e) {
//失败,抛出 CosServiceException
e.printStackTrace();
} catch (CosClientException e) {
//失败,抛出 CosClientException
e.printStackTrace();
}
// 关闭客户端
cosClient.shutdown();
}