管理凭证(Access Token)是七牛云存储用于验证管理请求合法性的机制。官方建议仅在业务服务器端使用这一类凭证,避免意外授权导致滥用。

官方文档

  • 凭证算法
  1. 生成待签名的原始字符串:

抽取请求URL中<path><path>?<query>的部分与请求内容部分(即HTTP Body),用“n”连接起来。
如无请求内容,该部分必须为空字符串。
注意:当Content-Typeapplication/x-www-form-urlencoded时,签名内容必须包括请求内容(即HTTP Body)。

signingStr = "<path>?<query>\n"
或
signingStr = "<path>?<query>\n<body>"
  1. 使用SecertKey对上一步生成的原始字符串计算HMAC-SHA1签名:

    sign = hmac_sha1(signingStr, "<SecretKey>")

  2. 对签名进行[URL安全的Base64编码]:
encodedSign = urlsafe_base64_encode(sign)
  1. 最后,将AccessKey和encodedSign用:连接起来:
accessToken = "<AccessKey>:<encodedSign>"
  • 计算示例

假设有如下的管理请求:

AccessKey = "MY_ACCESS_KEY"
SecretKey = "MY_SECRET_KEY"

url = "http://rs.qiniu.com/move/bmV3ZG9jczpmaW5kX21hbi50eHQ=/bmV3ZG9jczpmaW5kLm1hbi50eHQ="

则待签名的原始字符串是:

signingStr = "/move/bmV3ZG9jczpmaW5kX21hbi50eHQ=/bmV3ZG9jczpmaW5kLm1hbi50eHQ=\n"

签名字符串是:

注意:签名结果是二进制数据,此处输出的是每个字节的十六进制表示,以便核对检查。这里要注意,后面还会提到

sign = "157b18874c0a1d83c4b0802074f0fd39f8e47843"

编码后的签名字符串是:

encodedSign = "FXsYh0wKHYPEsIAgdPD9OfjkeEM="

最终的管理凭证是:

accessToken = "MY_ACCESS_KEY:FXsYh0wKHYPEsIAgdPD9OfjkeEM="
  • 查看Stat
GET /stat/ZGVtbzoyMDEzLTAyLTA5LTA3LTM5LTIwLmpwZw== HTTP/1.1
User-Agent: curl/7.30.0
Host: rs.qiniu.com
Accept: */*
Authorization: QBox QNJi_bYJlmO5LeY08FfoNj9w_r72Vsn...(过长已省略)
  • 返回结果
{
    "fsize":        5122935,
    "hash":         "ljfockr0lOil_bZfyaI2ZY78HWoH",
    "mimeType":     "application/octet-stream",
    "putTime":      13603956734587420
}
  • 代码示例
$app_info =  http://bucket_domain/key;
function get_state($app_info,  $qiniu_bucket, $qiniu_access_key, $qiniu_secret_key)
{

    $encodedEntryURI = base64_urlSafeEncode($qiniu_bucket.':'.trim(parse_url($app_info, PHP_URL_PATH), "/"));
    $signingStr = "/stat/".$encodedEntryURI."\n";
    $sign = hash_hmac('sha1', $signingStr, $qiniu_secret_key, TRUE);
//        $sign = mhash(MHASH_SHA1, $signingStr, $qiniu_secret_key); //这样也可以
    $encodedSign = base64_urlSafeEncode($sign);
    $accessToken = $qiniu_access_key.':'.$encodedSign;
    
    $res = curl_get('http://rs.qiniu.com/stat/'.$encodedEntryURI, 'QBox '.$accessToken); //添加`QBox`和半角空格和
    return $res;
}

function curl_get($url, $post=array(), $auth='', $timeout=10)
{
    $g_handle = curl_init();
    $header[] = "Authorization: $auth";

    $options = array(
        CURLOPT_HTTPHEADER => $header,
        CURLOPT_URL => $url,
        CURLOPT_POST => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FRESH_CONNECT => false,
        CURLOPT_FORBID_REUSE => false,
        CURLOPT_TIMEOUT => $timeout,
        CURLOPT_POSTFIELDS => http_build_query($post)
    );

    if(empty($post)) $options[CURLOPT_POST] = false;

    curl_setopt_array($g_handle, $options);

    $ret = curl_exec($g_handle);

    return $ret;
}
  • 说明

hash_hmac 函数

string hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = false ] )

使用 HMAC 方法生成带有密钥的哈希值,如果 raw_output 设置为 TRUE, 则返回原始二进制数据表示的信息摘要, 否则返回 16 进制小写字符串格式表示的信息摘要。 如果 algo 参数指定的不是受支持的算法,返回 FALSE。

URL安全的Base64编码

URL安全的Base64编码适用于以URL方式传递Base64编码结果的场景。该编码方式的基本过程是先将内容以Base64格式编码为字符串,然后检查该结果字符串,将字符串中的加号+换成中划线-,并且将斜杠/换成下划线_,同时尾部保持填充等号=。

/**
 * 对提供的数据进行urlsafe的base64编码。
 *
 * @param string $data 待编码的数据,一般为字符串
 *
 * @return string 编码后的字符串
 * @link http://developer.qiniu.com/docs/v6/api/overview/appendix.html#urlsafe-base64
 */
function base64_urlSafeEncode($data)
{
    $find = array('+', '/');
    $replace = array('-', '_');
    return str_replace($find, $replace, base64_encode($data));
}

Tags: php生成管理凭证, 七牛, 七牛获取stat

Related Posts:
  • [尚无相关文章]

Leave a Comment