1、访问管理

腾讯云 COS 服务在使用时需要对请求进行访问管理。通过临时密钥机制,您可以临时授权您的 App 访问您的存储资源,而不会泄露您的永久密钥。密钥的有效期由您指定,过期后自动失效。通常,我们都不建议您把永久密钥放到客户端代码中。本文主要介绍如何在后台快速搭建一个临时密钥服务,通过生成的临时密钥来对上传或者下载请求进行签名,从而保证您数据的安全性。

2、架构

整体架构图如下所示:

其中:

  • 应用 APP:即用户手机上的 App。

  • COS:腾讯云对象存储,负责存储 App 上传的数据。

  • CAM:腾讯云访问管理,用于生成 COS 的临时密钥。

  • 应用服务器:用户自己的后台服务器,这里用于获取临时密钥,并返回给应用 App。

 3、获取永久密钥

临时密钥需要通过永久密钥才能生成。请登录 腾讯云访问管理控制台 获取,包含:

  • SecretId
  • SecretKey

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。
字段类型描述
secretIdString云 API 密钥 Id
secretKeyString云 API 密钥 key
durationSecondsint要申请的临时密钥最长有效时间,单位秒,默认 1800,最大可设置 7200
bucketString存储桶名称:bucketName-appid, 如 example-125000000
regionString存储桶所属地域,如 ap-guangzhou
allowPrefixString资源的前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
allowActionsString[]授予 COS API 权限集合, 如简单上传操作:name/cos:PutObject
policyString策略:由 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
}
字段类型描述
credentialsString临时密钥信息
tmpSecretIdString临时密钥 Id,可用于计算签名
tmpSecretKeyString临时密钥 Key,可用于计算签名
sessionTokenString请求时需要用的 token 字符串,最终请求 COS API 时,需要放在 Header 的 x-cos-security-token 字段
startTimeString密钥的起始时间,是 UNIX 时间戳
expiredTimeString密钥的失效时间,是 UNIX 时间戳

更多推荐