前置条件

申请账号/子账号:访问管理 - 新建用户

申请 API 密钥:访问管理 - API 密钥管理

申请 COS 存储桶(bucket): 控制台 - 对象存储

签名算法

详见腾讯云文档中心 - 请求签名

签名验证工具:COS 签名工具

签名即输入 SecretIdSecretKey、有效时间时间戳,原始请求,得到以下签名内容的过程:

q-sign-algorithm=sha1 			// 签名算法
&q-ak=SecretId					// SecretId
&q-sign-time=KeyTime			// 开始/结束时间戳,例如 `1557902800;1557910000`
&q-key-time=KeyTime
&q-header-list=HeaderList		// HTTP 请求头列表,例如 `date;host;x-cos-acl;x-cos-grant-read`
&q-url-param-list=UrlParamList	// URL 参数列表,例如 `delimiter;max-keys;prefix`
&q-signature=Signature			// 签名,具体算法见文档

将上述内容放入 HTTP 请求的 Header,例如 Authorization: q-sign-algorithm=sha1&q-ak=...&q-sign-time=1557989753;1557996953&...&q-signature=...,或者 URL 请求参数中,例如 /exampleobject?q-sign-algorithm=sha1&q-ak=...&q-sign-time=1557989753%3B1557996953&...&q-signature=...,即可访问 COS 资源

如果使用临时密钥,还应将对应 token 传入 Header x-cos-security-token: ...,或者路径参数 &x-cos-security-token=...

后端访问

使用永久密钥访问 COS

如果通过 HTTP API 请求,则按照上述算法传入签名参数请求。或者通过对应语言的 SDK 请求

Python:Python SDK

!pip install -U cos-python-sdk-v5

from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import os

# 1. 设置用户属性, 包括 secret_id, secret_key, region等。Appid 已在 CosConfig 中移除,请在参数 Bucket 中带上 Appid。Bucket 由 BucketName-Appid 组成
secret_id = os.environ['COS_SECRET_ID']
secret_key = os.environ['COS_SECRET_KEY']
token = None               # 如果使用永久密钥不需要填入 token,如果使用临时密钥需要填入
region = 'ap-beijing'
scheme = 'https'           # 指定使用 http/https 协议来访问 COS,默认为 https,可不填

config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme)
client = CosS3Client(config)

安全凭证服务(Security Token Service,STS)

腾讯云提供的临时凭证的服务,调用其接口能获得临时访问凭证

域名为 sts.tencentcloudapi.com,可以直接调用云 API,也可以通过 SDK 内调用函数。

通常流程为在客户端调用后端自己的 STS 接口,后端使用永久密钥调用腾讯云 STS 服务得到临时密钥并返回给客户端,客户使用临时密钥访问资源。

tencent_cos_requests

SDK 调用,以 Go 为例 Github - qcloud-cos-sts-sdk

package main

import (
	sts "github.com/tencentyun/qcloud-cos-sts-sdk/go"
)

func main() {
    appid := os.Getenv("COS_APPID")
	bucket := os.Getenv("COS_BUCKET")
    secret_id := os.Getenv("COS_SECRET_ID")
	secret_key := os.Getenv("COS_SECRET_KEY")
	c := sts.NewClient(
		secret_id,
		secret_key,
		nil,
		// sts.Host("sts.internal.tencentcloudapi.com"), // 设置域名, 默认域名sts.tencentcloudapi.com
		// sts.Scheme("http"),      // 设置协议, 默认为https,公有云sts获取临时密钥不允许走http,特殊场景才需要设置http
	)
    // 策略概述 https://cloud.tencent.com/document/product/436/18023
	opt := &sts.CredentialOptions{
		DurationSeconds: int64(time.Hour.Seconds()),
		Region:          "ap-guangzhou",
		Policy: &sts.CredentialPolicy{
			Statement: []sts.CredentialPolicyStatement{
				{
					// 密钥的权限列表。简单上传和分片需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923
					Action: []string{
						// 简单上传
						"name/cos:PostObject",
						"name/cos:PutObject",
						// 分片上传
						"name/cos:InitiateMultipartUpload",
						"name/cos:ListMultipartUploads",
						"name/cos:ListParts",
						"name/cos:UploadPart",
						"name/cos:CompleteMultipartUpload",
					},
					Effect: "allow",
					Resource: []string{
						// 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
						// 存储桶的命名格式为 BucketName-APPID,此处填写的 bucket 必须为此格式
						"qcs::cos:ap-guangzhou:uid/" + appid + ":" + bucket + "/*",
					},
					// 开始构建生效条件 condition
					// 关于 condition 的详细设置规则和COS支持的condition类型可以参考https://cloud.tencent.com/document/product/436/71306
					Condition: map[string]map[string]interface{}{
						// "ip_equal": map[string]interface{}{
						// 	"qcs:ip": []string{
						// 		"10.217.182.3/24",
						// 		"111.21.33.72/24",
						// 	},
						// },
					},
				},
			},
		},
	}
    
    // case 1 请求临时密钥
	res, err := c.GetCredential(opt)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%+v\n", res)
	fmt.Printf("%+v\n", res.Credentials)
}

使用临时密钥访问 COS

使用临时密钥访问 COS

临时密钥是由 安全凭证服务(Security Token Service,STS) 提供的临时访问凭证,由 TmpSecretId、TmpSecretKey 和 Token 三部分组成

!pip install -U cos-python-sdk-v5

from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import os

# 1. 设置用户属性, 包括 secret_id, secret_key, region等。Appid 已在 CosConfig 中移除,请在参数 Bucket 中带上 Appid。Bucket 由 BucketName-Appid 组成
tmp_secret_id = 'TmpSecretId'
tmp_secret_key = 'TmpSecretKey'
token = 'TmpToken'
region = 'ap-beijing'
scheme = 'https'           # 指定使用 http/https 协议来访问 COS,默认为 https,可不填

config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme)
client = CosS3Client(config)