管理凭证(Access Token)是七牛云存储用于验证管理请求合法性的机制。官方建议仅在业务服务器端使用这一类凭证,避免意外授权导致滥用。凭证算法生成待签名的原始字符串:
抽取请求URL中或?的部分与请求内容部分(即HTTP Body),用“n”连接起来。
如无请求内容,该部分必须为空字符串。
注意:当Content-Type为application/x-www-form-urlencoded时,签名内容必须包括请求内容(即HTTP Body)。signingStr = "?\n"
或
signingStr = "?\n"使用SecertKey对上一步生成的原始字符串计算HMAC-SHA1签名:
sign = hmac_sha1(signingStr, "")
对签名进行[URL安全的Base64编码]:encodedSign = urlsafe_base64_encode(sign)最后,将AccessKey和encodedSign用:连接起来:accessToken = ":"计算示例
假设有如下的管理请求: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="查看StatGET /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));
}[尚无相关文章]