签名与鉴权

最近更新时间:2019-03-13 11:50:42

注意:

以下鉴权与签名方法,仅适用于原微视频用户,新用户请参见 COS 上传 API 请求签名

1 签名与鉴权

腾讯移动服务通过签名来验证请求的合法性。开发者通过将签名授权给客户端,使其具备上传下载及管理指定资源的能力。签名分为以下两种:

  • 多次有效签名:签名中不绑定文件fileid,需要设置大于当前时间的有效期,有效期内此签名可多次使用,有效期最长可设置三个月。
  • 单次有效签名:签名中绑定文件 fileid,有效期必须设置为0,此签名只可使用一次,且只能应用于被绑定的文件。
    具体适用场景参见 签名适用场景

2 签名算法

2.1 获取签名所需信息

生成签名所需信息包括项目 ID(appid),空间名称(Bucket,视频资源的组织管理单元),项目的 Secret ID 和Secret Key。获取这些信息的方法如下:

  1. 登录视频处理 控制台, 进入视频空间;
  2. 如开发者未创建视频空间,可添加视频空间,空间名称(bucket)由用户自行输入;
  3. 登录视频处理 控制台,进入项目设置;
  4. 如果开发者未添加密钥,则需添加密钥,获取项目的 Secret ID 和 Secret Key,每个项目最多添加两对密钥;如果已经添加过密钥则直接获取项目的 Appid、Secret ID 和 Secret Key。

注意:

2.2 拼接签名串

  • 拼接多次有效签名串:
    a=[appid]&b=[bucket]&k=[SecretID]&e=[expiredTime]&t=[currentTime]&r=[rand]&f=

  • 拼接单次有效签名串:
    a=[appid]&b=[bucket]&k=[SecretID]&e=[expiredTime]&t=[currentTime]&r=[rand]&f=[fileid]

签名串中各字段含义如下:

字段 解释
a 开发者的项目 ID,接入微视频创建空间时系统生成的唯一标识项目的 ID,即 Appid
b 视频空间名称 Bucket
k 项目的 Secret ID
e 签名的有效期,是一个符合 UNIX Epoch 时间戳规范的数值,单位为秒;单次签名时,e 必须设置为0
t 当前时间戳,是一个符合 UNIX Epoch 时间戳规范的数值,单位为秒,多次签名时,e 应大于 t
r 随机串,无符号10进制整数,用户需自行生成,最长10位
fileid 资源存储的唯一标识,格式为"/appid/bucketname/用户自定义路径或资源名",并且需要对其中非'/'字符进行 urlencode 编码

注意:

  • 拼接单次有效签名的签名串时,过期时间 e 必须设置为0,以保证此签名只能只能针对固定资源且只能使用一次;
  • 删除文件必须使用单次有效签名;
  • 上传必须使用多次有效签名;

具体适用场景参见 签名适用场景

2.3 生成签名

  1. 视频处理使用 HMAC-SHA1 算法对请求进行签名;
  2. 签名串需要使用 Base64 编码。
  3. 即生成签名的公式如下:
    • SignTmp = HMAC-SHA1(SecretKey, orignal)
    • Sign = Base64(SignTmp.orignal)

其中 SecretKey为2.1节获取的 Secret Key,orignal 为2.2节中拼接好的签名串,首先对 orignal 使用 HMAC-SHA1 算法进行签名,然后将 orignal 附加到签名结果的末尾,再进行 Base64 编码,得到最终的 sign。

注意:

此处使用的是标准的 Base64 编码,不是 urlsafe 的 Base64 编码。

3 实例

本节介绍生成签名的算法实例,实例中使用 PHP 语言,如果开发者使用其他与开发,请使用对应的算法。

3.1 获取签名所需信息

获取得到的签名所需信息如下。

  • 项目ID:200001
  • 空间名称(bucket):newbucket
  • Secret ID:AKIDUfLUEUigQiXqm7CVSspKJnuaiIKtxqAv
  • Secret Key:bLcPnl88WU30VY57ipRhSePfPdOfSruK

3.2 拼接签名串

  • 拼接的多次有效签名串如下:
    a=200001&b=newbucket&k=AKIDUfLUEUigQiXqm7CVSspKJnuaiIKtxqAv&e=1438669115&t=1436077115&r=11162&f=

  • 拼接的单次有效签名串如下:
    a=10001290&b=tencentyun&k=AKIDgaoOYh2kOmJfWVdH4lpfxScG2zPLPGoK&e=0&t=1436077115&r=11162&f=tencentyunSignTest

示例代码如下:

$appid = "200001";
$bucket = "newbucket";
$secret_id = "AKIDUfLUEUigQiXqm7CVSspKJnuaiIKtxqAv";
$secret_key = "bLcPnl88WU30VY57ipRhSePfPdOfSruK";
$expired = time() + 60;
$onceExpired = 0;
$current = time();
$rdm = rand();
$userid = "0";
$fileid = "/200001/newbucket/tencent_test.jpg";

$srcStr = 'a='.$appid.'&b='.$bucket.'&k='.$secret_id.'&e='.$expired.'&t='.$current.'&r='.$rdm.'&f=';

$srcStrOnce= 'a='.$appid.'&b='.$bucket.'&k='.$secret_id.'&e='.$onceExpired .'&t='.$current.'&r='.$rdm
.'&f='.$fileid;

3.3 生成签名

示例代码如下:

$signStr = base64_encode(hash_hmac('SHA1', $srcStr, $secret_key, true).$srcStr);

$signStrOnce = base64_encode(hash_hmac('SHA1',$srcStrOnce,$secret_key, true).$srcStrOnce);

echo $signStr."\n"; 

echo $signStrOnce."\n";
  • 多次有效签名为:
    vxzLR6vzMNhBMUVzMTWKUB+LMeVhPTIwMDAwMSZrPUFLSURVZkxVRVVpZ1FpWHFtN0 NWU3NwS0pudWFpSUt0eHFBdiZlPTE0Mzc5OTU3MDQmdD0xNDM3OTk1NjQ0JnI9MjA4 MTY2MDQyMSZmPSZiPW5ld2J1Y2tldA==

  • 单次有效签名为:
    f11dDSuw86CR02Ko1INzsZstbRlhPTIwMDAwMSZrPUFLSURVZkxVRVVpZ1FpWHFtN0 NWU3NwS0pudWFpSUt0eHFBdiZlPTAmdD0xNDM3OTk1NjQ1JnI9MTE2NjcxMDc5MiZm PS8yMDAwMDEvbmV3YnVja2V0L3RlbmNlbnRfdGVzdC5qcGcmYj1uZXdidWNrZXQ=

4 签名适用场景

视频处理对签名的适用场景做了如下限制:

场景
适用签名
下载(不开启 Token 防盗链) 不验证签名
上传 多次有效签名
查询目录、文件
创建目录
下载(开启 Token 防盗链)
删除目录、文件 单次有效签名
更新目录、文件