前置条件
申请账号/子账号:访问管理 - 新建用户
申请 API 密钥:访问管理 - API 密钥管理
申请 COS 存储桶(bucket): 控制台 - 对象存储
签名算法
签名验证工具:COS 签名工具
签名即输入 SecretId
、SecretKey
、有效时间时间戳,原始请求,得到以下签名内容的过程:
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 服务得到临时密钥并返回给客户端,客户使用临时密钥访问资源。
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
临时密钥是由 安全凭证服务(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)