1、访问管理
腾讯云 COS 服务在使用时需要对请求进行访问管理。通过临时密钥机制,您可以临时授权您的 App 访问您的存储资源,而不会泄露您的永久密钥。密钥的有效期由您指定,过期后自动失效。通常,我们都不建议您把永久密钥放到客户端代码中。本文主要介绍如何在后台快速搭建一个临时密钥服务,通过生成的临时密钥来对上传或者下载请求进行签名,从而保证您数据的安全性。
2、架构
整体架构图如下所示:
其中:
-
应用 APP:即用户手机上的 App。 -
COS:腾讯云对象存储,负责存储 App 上传的数据。 -
CAM:腾讯云访问管理,用于生成 COS 的临时密钥。 -
应用服务器:用户自己的后台服务器,这里用于获取临时密钥,并返回给应用 App。
?3、获取永久密钥
临时密钥需要通过永久密钥才能生成。请登录?腾讯云访问管理控制台?获取,包含:
4、如何快速搭建临时密钥服务
4.1 集成java SDK 到 您的后台服务
如果您已经有独立的后台服务,我们建议您直接集成我们提供的 SDK 到现在的后台服务中。
使用 maven 集成方式,在 Java 工程中的 pom.xml 文件中添加如下的 maven 依赖:
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos-sts_api</artifactId>
<version>3.1.0</version>
</dependency>
4.2 测试示例
获取临时密钥
package com.ybw.cos;
import com.alibaba.fastjson.JSON;
import com.tencent.cloud.CosStsClient;
import com.tencent.cloud.Response;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.util.TreeMap;
/**
* @author ybwei
* @date 2022/3/21 14:15
**/
@Slf4j
public class CosStsClientTest {
/**
* 基本的临时密钥申请示例,适合对一个桶内的一批对象路径,统一授予一批操作权限
*/
@Test
public void testGetCredential() throws IOException {
TreeMap<String, Object> config = new TreeMap<String, Object>();
// 云 api 密钥 SecretId
config.put("secretId", "secretId");
// 云 api 密钥 SecretKey
config.put("secretKey", "secretKey");
// 设置域名
//config.put("host", "sts.internal.tencentcloudapi.com");
// 临时密钥有效时长,单位是秒
config.put("durationSeconds", 1800);
// 换成你的 bucket
config.put("bucket", "test-1257362353");
// 换成 bucket 所在地区
config.put("region", "ap-beijing");
// 可以通过 allowPrefixes 指定前缀数组, 例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
config.put("allowPrefixes", new String[]{
"*"
});
// 密钥的权限列表。简单上传和分片需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923
String[] allowActions = new String[]{
// 简单上传
"name/cos:PutObject",
"name/cos:PostObject",
// 分片上传
"name/cos:InitiateMultipartUpload",
"name/cos:ListMultipartUploads",
"name/cos:ListParts",
"name/cos:UploadPart",
"name/cos:CompleteMultipartUpload"
};
config.put("allowActions", allowActions);
Response response = CosStsClient.getCredential(config);
log.info("response:{}", JSON.toJSONString(response));
log.info(response.credentials.tmpSecretId);
log.info(response.credentials.tmpSecretKey);
log.info(response.credentials.sessionToken);
}
}
请求参数说明
必须修改参数,其他参数根据自身情况修改。
- secretId。
- secretKey。
- bucket。
- region。
字段 | 类型 | 描述 |
---|
secretId | String | 云 API 密钥 Id | secretKey | String | 云 API 密钥 key | durationSeconds | int | 要申请的临时密钥最长有效时间,单位秒,默认 1800,最大可设置 7200 | bucket | String | 存储桶名称:bucketName-appid, 如 example-125000000 | region | String | 存储桶所属地域,如 ap-guangzhou | allowPrefix | String | 资源的前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用) | allowActions | String[] | 授予 COS API 权限集合, 如简单上传操作:name/cos:PutObject | policy | String | 策略:由 allowActions、bucket、region、allowPrefix字段组成的描述授权的具体信息 |
返回值说明
{
"credentials": {
"sessionToken": "XiV7XGnS3ae0aT2Tsg1eLX0xAjRO8nVa2de901aac56adbbab8f82d0b86c40892k9Or7bxCDcXBmxGqtUPSerkMnBKBk6zc_4DcYs-K0kjaICbG9En2Fzj9anyjsCDhGCurkwB6F_dULedvPpxQk9HnoWGrtkJRPfZc6aMndq5H3PASqDe2nxmJvSl4BpTG8XnSQFKi9nKxSYU8hIvqWGtmoFO7MavAR73UcLsXg1SUiDOIJKYGy4b2iRZHULDfx3Jbu61smksl1Nx4IH7JOLuza8YM5XzD91FTOkZVoIDyQqSMV13K16uvIf5ICIVGlfdrCTkQ0NzbKrJkTNnAwC1ZoJ4S6058YgaYOjQkG4JjBvhJKrK_6Vvif4A8lM86OsnLth8NpiiTdRd2IwJfTLn3TlvpWAjGMWHSWN_Z6nixArV7wI4IYp786RriatpgU5VPNTF0T1iBS_C0_uaRfJYyd4PKYzEulFD84sT2OzxdVOsvsqsqgdVdSClq9DlWGcdqhrixYzVeYHHY-z-r1uuaoEfYb4csfKoBnyZDp7kUtK3-EGrYeO5aTZNU6ObAk_88YjGRQYhdKMA29QCksIL9YWo9n66BLw-3LwSWlNflMaTF9eooRRpPVW2ZkrtQ",
"tmpSecretId": "AKIDws3viHvKQ6MFIbA2ztvuUd9x08FyEP8dNq-AW_KSm37AsSyaTirgkjrjj7lhuS2z",
"tmpSecretKey": "TH1p4q9NOsGxbfYIwU23ecD7Xp6wlY4LzU2jOmIyUaE="
},
"expiration": "2022-03-21T06:47:12Z",
"expiredTime": 1647845232,
"requestId": "5b93b42b-a967-48d9-b140-463ee9aa3765",
"startTime": 1647843432
}
字段 | 类型 | 描述 |
---|
credentials | String | 临时密钥信息 | tmpSecretId | String | 临时密钥 Id,可用于计算签名 | tmpSecretKey | String | 临时密钥 Key,可用于计算签名 | sessionToken | String | 请求时需要用的 token 字符串,最终请求 COS API 时,需要放在 Header 的 x-cos-security-token 字段 | startTime | String | 密钥的起始时间,是 UNIX 时间戳 | expiredTime | String | 密钥的失效时间,是 UNIX 时间戳 |
|