QingStor 对象存储支持请求参数签名

用户通过 API 请求 QingStor 时,需要对请求进行签名,现有的签名方式是首先计算签名串,然后添加到请求头 (Request Headers),和 API 请求一起发送到 QingStor 服务端。

然而并不是所有客户端都有能力设置请求头字段,又或者用户想要分享某个私有权限的文件链接给其它用户,基于这样的需求,QingStor 新增了基于请求参数 (Query String) 的签名方式。

请求参数签名的方式不需要在 HTTP 请求头中附加任何内容,只需要在请求参数中添加以下三项必要参数:

  • access_key_id – 在 QingCloud 控制台申请的 Access Key ID
  • expires – 签名过期时间,该时间为 Unix Time (也称为 Epoch Time), 表示方法是自历元(1970-01-01 00:00, The Epoch) 之后的秒数, 类型为整数。在过期时间之后到达的请求将被 QingStor 拒绝
  • signature – 对签名串 string_to_sign 经过 HMAC-SHA256 加密后,再使用 Base64 编码,最后使用 URI 编码后的结果

请求示例:

GET /music.mp3?access_key_id=PLLZOBTTZXGBNOWUFHZZ&expires=1479107162&signature=tuXu/KcggHWPAfEmraUHDwEUdiIPSXVRsO%2BT2rxomBQ%3D
Host: mybucket.pek3a.qingstor.com
Date: Mon, 14 Nov 2016 14:05:00 GMT

相比于请求头签名方法,签名串 string_to_sign 的生成过程只有一点不同,即把 Date 替换为 Expires:

string_to_sign = Verb + "\n"
               + Content-MD5 + "\n"
               + Content-Type + "\n"
               + Expires + "\n"
              (+ Canonicalized Headers + "\n")
               + Canonicalized Resource

通过上述方法得到签名串 string_to_sign 以后计算 signature (以 Python 为例):

import hmac
import base64
import urllib
from hashlib import sha256

h = hmac.new(secret_access_key, digestmod=sha256)
h.update(string_to_sign)
signature = urllib.quote(base64.b64encode(h.digest()).strip())

最后拼接成请求参数,追加到请求地址的后面:

access_key_id=PLLZOBTTZXGBNOWUFHZZ&expires=1479107162&signature=tuXu/KcggHWPAfEmraUHDwEUdiIPSXVRsO%2BT2rxomBQ%3D

用户还可以使用 QingStor SDK 生成参数签名的 URL 链接,下面以 QingStor Go SDK 为例:

import (
    "github.com/yunify/qingstor-sdk-go/config"
    qs "github.com/yunify/qingstor-sdk-go/service"
)

configuration, err := config.New("ACCESS_KEY_ID", "SECRET_ACCESS_KEY")
qsService, err := qs.Init(configuration)
bucket, err := qsService.Bucket("test-bucket", "pek3a")

request, _, err := bucket.GetObjectRequest("test-object", nil)
err = request.SignQuery(3600) // Expires in 1 hour
signedURL = request.HTTPRequest.URL.String()
* 注:QingStor 各语言 SDK 均已支持请求参数签名,SDK 的安装和使用方法请参考文档

参数签名使用的场合较为广泛,它所能达成的效果跟请求头签名完全一样,只是让附带签名的过程更加方便和易于使用。更多 QingStor 签名有关的内容请参考文档