欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP生成騰訊云COS接口需要的請(qǐng)求簽名

 更新時(shí)間:2018年05月20日 22:50:51   作者:Cinlap  
這篇文章主要介紹了使用 PHP 創(chuàng)建 COS 接口所需要的請(qǐng)求簽名,與官方文檔給出的示例做比較,驗(yàn)證算法的正確性,需要的朋友可以參考下

COS和請(qǐng)求簽名是什么

COS 是騰訊云對(duì)象存儲(chǔ)的縮寫及簡稱,請(qǐng)求簽名是第三方在調(diào)用COS相關(guān)接口時(shí)需要按需提供的、經(jīng)過特定算法創(chuàng)建而成的一組字符串信息,將唯一的標(biāo)識(shí)當(dāng)前第三方身份,提供通信雙方的身份識(shí)別,只有有效的簽名COS才會(huì)提供服務(wù)

目標(biāo)

使用 PHP 創(chuàng)建 COS 接口所需要的請(qǐng)求簽名,與官方文檔給出的示例做比較,驗(yàn)證算法的正確性

認(rèn)識(shí)請(qǐng)求簽名

先來看一條官方文檔給出的請(qǐng)求簽名的樣子

q-sign-algorithm=sha1&q-ak=[SecretID]&q-sign-time=[SignTime]&q-key-time=[KeyTime]&q-header-list=[SignedHeaderList]&q-url-param-list=[SignedParameterList]&q-signature=[Signature]

請(qǐng)求簽名特點(diǎn)總結(jié)

  • 是一串字符串
  • key=value的鍵值對(duì)格式,key為固定值
  • 一共有7對(duì)key=value
  • sha1也是參數(shù),但截止到官方發(fā)文只支持sha1,因此可以直接賦值
  • SignedHeaderList、SignedParameterList、Signature三個(gè)value需要通過算法生成

鍵值對(duì)的具體描述參見官方文檔

逐個(gè)擊破

請(qǐng)求簽名一共需要7個(gè)值,下面一一講解,各個(gè)擊破

q-sign-algorithm

簽名算法,官方目前僅支持 sha1,因此直接給值即可

q-ak

賬戶ID,即用戶的 SecretId,可以在控制臺(tái) 云API密鑰 頁面獲取

q-sign-time

當(dāng)前簽名的有效起止時(shí)間,Unix時(shí)間戳格式,英文半角分號(hào) ; 分割,格式如 1480932292;1481012298

q-key-time

與 q-sign-time 值相同

q-header-list

個(gè)人理解,由HTTP請(qǐng)求頭組成,取全部或部分請(qǐng)求頭,將 key:value 形式的請(qǐng)求項(xiàng)的 key 部分取出,轉(zhuǎn)化小寫,多個(gè) key 按字典排序,以字符 ; 連接,最終組成字符串

如原始請(qǐng)求頭有兩個(gè):

Host:bucket1-1254000000.cos.ap-beijing.myqcloud.com
Content-Type:image/jpeg

key 就是 Host 和 Content-Type,經(jīng)過運(yùn)算后輸出 content-type;host

q-url-param-list

個(gè)人理解,由HTTP請(qǐng)求參數(shù)組成,取全部或部分請(qǐng)求參數(shù),將 key=value 形式的請(qǐng)求參數(shù)的 key 部分取出,轉(zhuǎn)化小寫,多個(gè) key 按字典排序,以字符 ; 連接,最終組成字符串

如原始HTTP請(qǐng)求為:

GET /?prefix=abc&max-keys=20

key 就是 prefix 和 max-keys,經(jīng)過運(yùn)算后輸出 max-keys;prefix,如果請(qǐng)求沒有參數(shù)比如 put、post,此處即為空

q-signature

根據(jù)HTTP內(nèi)容計(jì)算簽名,算法由COS提供,只需按要求給值

官方示例及參照結(jié)果

在開始編寫邏輯之前,先看一下官方示例給出的參考值,以及經(jīng)過計(jì)算后的結(jié)果,以便和自己開發(fā)的邏輯進(jìn)行結(jié)果比對(duì)

HTTP原始請(qǐng)求,也可以理解為計(jì)算簽名前或不需要簽名時(shí)的HTTP請(qǐng)求:

PUT /testfile2 HTTP/1.1
Host: bucket1-1254000000.cos.ap-beijing.myqcloud.com
x-cos-content-sha1: 7b502c3a1f48c8609ae212cdfb639dee39673f5e
x-cos-storage-class: standard

Hello world

計(jì)算簽名后應(yīng)該得到的HTTP請(qǐng)求:

PUT /testfile2 HTTP/1.1
Host: bucket1-1254000000.cos.ap-beijing.myqcloud.com
x-cos-content-sha1: 7b502c3a1f48c8609ae212cdfb639dee39673f5e
x-cos-storage-class: standard
Authorization: q-sign-algorithm=sha1&q-ak=AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q&> q-sign-time=1417773892;1417853898&q-key-time=1417773892;1417853898&q-header-list=host;x-cos-content-sha1;x-cos-storage-class&q-url-param-list=&q-signature=14e6ebd7955b0c6da532151bf97045e2c5a64e10

Hello world

結(jié)論:算法如果能得到 Authorization 后的那一串字符串即為正確

準(zhǔn)備工作

來看一下(官方提供的)用戶信息以及HTTP信息:

  • SecretId:AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q
  • SecretKey:BQYIM75p8x0iWVFSIgqEKwFprpRSVHlz
  • 簽名有效起始時(shí)間:1417773892
  • 簽名有效停止時(shí)間:1417853898
  • HTTP原始請(qǐng)求頭:根據(jù)上一節(jié)示例不難得到HTTP原始請(qǐng)求有三項(xiàng)內(nèi)容 Host、x-cos-content-sha1 和 x-cos-storage-class
  • HTTP請(qǐng)求參數(shù):是 PUT 請(qǐng)求,沒有 ? 參數(shù)

計(jì)算簽名

將準(zhǔn)備工作中的各項(xiàng)參數(shù)帶入請(qǐng)求簽名規(guī)則,不難就可以得到結(jié)果,如下表:

鍵(key) 值(value) 備注
q-sign-algorithm sha1 目前僅支持 sha1 簽名算法
q-ak AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q SecretId 字段
q-sign-time 1417773892;1417853898 2014/12/5 18:04:52 到 2014/12/6 16:18:18
q-key-time 1417773892;1417853898 2014/12/5 18:04:52 到 2014/12/6 16:18:18
q-header-list host;x-cos-content-sha1;x-cos-storage-class HTTP 頭部 key 的字典順序排序列表
q-url-param-list HTTP 參數(shù)列表為空
q-signature 14e6ebd7955b0c6da532151bf97045e2c5a64e10 通過代碼計(jì)算所得

但 q-signature 怎么來的?

剛才說到,q-signature 也需要特定算法計(jì)算得來,下面就說明如何計(jì)算

計(jì)算請(qǐng)求簽名

先看代碼:

/**
 * 計(jì)算簽名
 * secretId、secretKey 為必需參數(shù),qSignStart、qSignEnd為調(diào)試需要,測試通過后應(yīng)取消,改為方法內(nèi)自動(dòng)創(chuàng)建
 */
function get_authorization( $secretId, $secretKey, $qSignStart, $qSignEnd, $fileUri, $headers ){
 /* 
 * 計(jì)算COS簽名
 * 2018-05-17
 * author:cinlap <cash216@163>
 * ref:https://cloud.tencent.com/document/product/436/7778
 */

 $qSignTime = "$qSignStart;$qSignEnd"; //unix_timestamp;unix_timestamp
 $qKeyTime = $qSignTime;

 $header_list = get_q_header_list($headers);
 //如果 Uri 中帶有 ?的請(qǐng)求參數(shù),該處應(yīng)為數(shù)組排序后的字符串組合
 $url_param_list = '';

 //compute signature
 $httpMethod = 'put';
 $httpUri = $fileUri;

 //與 q-url-param-list 相同
 $httpParameters = $url_param_list;

 //將自定義請(qǐng)求頭分解為 & 連接的字符串
 $headerString = get_http_header_string( $headers );

 // 計(jì)算簽名中的 signature 部分
 $signTime = $qSignTime;
 $signKey = hash_hmac('sha1', $signTime, $secretKey);
 $httpString = "$httpMethod\n$httpUri\n$httpParameters\n$headerString\n";
 $sha1edHttpString = sha1($httpString);
 $stringToSign = "sha1\n$signTime\n$sha1edHttpString\n";
 $signature = hash_hmac('sha1', $stringToSign, $signKey);
 //組合結(jié)果
 $authorization = "q-sign-algorithm=sha1&q-ak=$secretId&q-sign-time=$qSignTime&q-key-time=$qKeyTime&q-header-list=$header_list&q-url-param-list=$url_param_list&q-signature=$signature";
 return $authorization;
}

為了測試,該方法參數(shù)應(yīng)該是多過需要了,前六個(gè)參數(shù)是已經(jīng)給出的,是來自用戶的,因此直接賦值即可得到下邊字符串:

$authorization = "q-sign-algorithm=sha1&q-ak=$secretId&q-sign-time=$qSignTime&q-key-time=$qKeyTime...

$header_list 這個(gè)值要符合 q-header-list 規(guī)則因此需要計(jì)算,邏輯是上文已經(jīng)描述,是從既定的請(qǐng)求項(xiàng)中抽出 key 組成有序字符串,代碼如下:

/**
 * 按COS要求對(duì)header_list內(nèi)容進(jìn)行轉(zhuǎn)換
 * 提取所有key
 * 字典排序
 * key轉(zhuǎn)換為小寫
 * 多對(duì)key=value之間用連接符連接
 * 
 */
function get_q_header_list($headers){
 if(!is_array($headers)){
  return false;
 }

 try{
  $tmpArray = array();
  foreach( $headers as $key=>$value){
   array_push($tmpArray, strtolower($key));
  }
  sort($tmpArray);
  return implode(';', $tmpArray);
 }
 catch(Exception $error){
  return false;
 }
}

$url-param-list 上面講過,這個(gè)值是HTTP請(qǐng)求參數(shù),對(duì)于 PUT 方法沒有 ? 參數(shù),自然值為空,所以代碼中“偷懶”直接給了空字符串。

Signature 的計(jì)算和需要小心的地方

官方已經(jīng)給出了完整的算法,PHP 甚至還有寫好的代碼,應(yīng)該是很幸福了(但!由于看官方文檔看的頭暈還是踩了坑,隨后一起說明),先看一下 signature 的“格式”:

SignKey = HMAC-SHA1(SecretKey,"[q-key-time]")
HttpString = [HttpMethod]\n[HttpURI]\n[HttpParameters]\n[HttpHeaders]\n
StringToSign = [q-sign-algorithm]\n[q-sign-time]\nSHA1-HASH(HttpString)\n
Signature = HMAC-SHA1(SignKey,StringToSign)

再看一下 Signature 的完整算法:

$signTime = $qSignTime;
$signKey = hash_hmac('sha1', $signTime, $secretKey);
$httpString = "$httpMethod\n$httpUri\n$httpParameters\n$headerString\n";
$sha1edHttpString = sha1($httpString);
$stringToSign = "sha1\n$signTime\n$sha1edHttpString\n";
$signature = hash_hmac('sha1', $stringToSign, $signKey);

$signTime:很簡單,起止時(shí)間組成的字符串,從上文拿來直接用
$signKey:HMAC-SHA1 算法直接計(jì)算即可
$httpString:四個(gè)部分組成需要分開說
1、$httpMethod:HTTP請(qǐng)求方法,小寫,比如 put、get
2、$httpUri:HTTP請(qǐng)求的URI部分,從“/”虛擬根開始,如 /testfile 說明在存儲(chǔ)桶根目錄下創(chuàng)建一個(gè)叫 testfile 的文件,/image/face1.jpg 說明在根目錄/image目錄下建立一個(gè)叫 face1.jpg 的文件,至于是不是圖片文件,不管
3、$httpParameters:這是第一個(gè)需要小心的地方。由HTTP原始請(qǐng)求參數(shù)組成,即請(qǐng)求 URI 中 ? 后面的部分,本例調(diào)用的是 PUT Object 接口,因此為空。如果不為空,需要把請(qǐng)求參數(shù)每一項(xiàng)的 key 和 value 均轉(zhuǎn)換小寫,多對(duì) key=value 按字典排序并以 & 相連接
4、$headerString:這是第二個(gè)需要小心的地方,由 HTTP 原始請(qǐng)求頭組成,根據(jù)請(qǐng)求頭,選擇全部或部分請(qǐng)求頭,把每項(xiàng)的key都轉(zhuǎn)換為小寫,把value都進(jìn)行URLEncode轉(zhuǎn)換,每項(xiàng)格式都改為key=value,然后按照key進(jìn)行字典排序,最后把它們用連接符 & 組成字符串。這是我整理的邏輯,代碼如下:

/**
 * 按COS要求從數(shù)組中獲取 Signature 中 [HttpString] 內(nèi)容
 * 標(biāo)準(zhǔn)格式 key=value&key=value&... 
 * 數(shù)組元素按鍵字典排序 * 
 * key轉(zhuǎn)換為小寫
 * value進(jìn)行UrlEncode轉(zhuǎn)換
 * 轉(zhuǎn)換為key=value格式
 * 多對(duì)key=value之間用連接符連接
 * 
 */
function get_http_header_string($headers){
 if(!is_array($headers)){
  return false;
 }

 try{
  $tmpArray = array();
  foreach($headers as $key => $value){
   $tmpKey = strtolower($key);
   $tmpArray[$tmpKey] = urlencode($value);
  }
  ksort($tmpArray);
  $headerArray = array();
  foreach( $tmpArray as $key => $value){
   array_push($headerArray, "$key=$value");
  }
  return implode('&', $headerArray);
 }
 catch(Exception $error){
  return false;
 }
}

為什么要小心?

HTTP原始請(qǐng)求頭和請(qǐng)求參數(shù)用在了四個(gè)地方,分別是請(qǐng)求簽名里的 q-header-list 和 Signature 里的 HttpHeaders——兩者都用到了HTTP原始請(qǐng)求頭;請(qǐng)求簽名里的 q-url-param-list 和 Signature 里的 HttpParameters——兩者都用到了HTTP請(qǐng)求參數(shù)。一定要保證HTTP請(qǐng)求頭和請(qǐng)求參數(shù)所選用的數(shù)量和對(duì)象一致

  • 相同:生成 q-header-list 的HTTP請(qǐng)求頭數(shù)量和成員要和生成 HttpHeaders 的相同,生成 q-url-param-list 的HTTP請(qǐng)求參數(shù)數(shù)量和成員要和生成 HttpParameters 的相同
  • 不同:q-header-list 和 q-url-param-list 只取 key 部分,HttpHeaders 和 HttpParameters 取 key 和 value 部分

輸出結(jié)果和校驗(yàn)

至此,請(qǐng)求簽名中7個(gè)值都有了,有的是來自用戶信息,有的需要計(jì)算,需要計(jì)算的上面也給出了所有的計(jì)算方法和為什么如此計(jì)算的個(gè)人理解。最后只需要按照官方要求進(jìn)行輸出即可??匆幌?#127792;,在PostMan中選擇Post方法,選擇form-data方式提交數(shù)據(jù),在Body中給出所有用戶參數(shù)(這個(gè)地方為了測試算法是否與官方一直,所以幾乎所有的值都是Post提交上去的,實(shí)際時(shí)間、Host都可以在算法中創(chuàng)建)

提交后,返回結(jié)果

字很小,單獨(dú)把結(jié)果提取出來

{
 "Authorization": "q-sign-algorithm=sha1&q-ak=AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q&q-sign-time=1417773892;1417853898&q-key-time=1417773892;1417853898&q-header-list=host;x-cos-content-sha1;x-cos-storage-class&q-url-param-list=&q-signature=14e6ebd7955b0c6da532151bf97045e2c5a64e10",
 "Host": "bucket1-1254000000.cos.ap-beijing.myqcloud.com",
 "Content-Length": "12000"
}

Host和Content-Length是我自定義輸出,主要是看Authorization部分,和官方文檔給出的結(jié)果值完全一致,說明算法邏輯正確。

吐槽和反思

version 0.2

昨天基于對(duì)騰訊云API的“憤慨”和怕忘記而急于記下思路的原因,寫的很是潦草,發(fā)覺吐槽人家官方文檔順序不同自己的更不同,今天重寫

version 0.1

之前 C# 做過一次對(duì)接口的研究,死活不行,最后通過騰訊技術(shù)支持提供的AWS的SDK調(diào)用成功,真是心累。本次需要用PHP做項(xiàng)目,必須要攻克,本來不應(yīng)該多難,必須要為自己的智力和年齡討個(gè)說法。不過還是想再次吐槽官方文檔,看似詳盡,順序前后不夠一致,示例代碼細(xì)節(jié)比如參數(shù)不夠統(tǒng)一,造成新手容易誤解怎么前后對(duì)不上,對(duì)一些細(xì)節(jié)和前后邏輯不能第一時(shí)間融匯貫通。比如我自己,就是再次研究接口時(shí),才理解里邊關(guān)于[SignHeaderList]等和計(jì)算[Signature]有什么關(guān)聯(lián)。

相關(guān)文章

  • Linux平臺(tái)PHP5.4設(shè)置FPM線程數(shù)量的方法

    Linux平臺(tái)PHP5.4設(shè)置FPM線程數(shù)量的方法

    這篇文章主要介紹了Linux平臺(tái)PHP5.4設(shè)置FPM線程數(shù)量的方法,較為詳細(xì)的分析了Linux平臺(tái)php5.4設(shè)置FPM的相關(guān)參數(shù)、功能及使用技巧,需要的朋友可以參考下
    2016-11-11
  • PHP查詢大量數(shù)據(jù)內(nèi)存耗盡問題的解決方法

    PHP查詢大量數(shù)據(jù)內(nèi)存耗盡問題的解決方法

    這篇文章主要為大家詳細(xì)介紹了PHP查詢大量數(shù)據(jù)內(nèi)存耗盡問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • php基于Snoopy解析網(wǎng)頁html的方法

    php基于Snoopy解析網(wǎng)頁html的方法

    這篇文章主要介紹了php基于Snoopy解析網(wǎng)頁html的方法,實(shí)例分析了使用Snoopy類解析html文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • php 多線程上下文中安全寫文件實(shí)現(xiàn)代碼

    php 多線程上下文中安全寫文件實(shí)現(xiàn)代碼

    提供一個(gè)php多線程上下文中安全寫文件的實(shí)現(xiàn)方法。這個(gè)實(shí)現(xiàn)沒有使用php 的file lock機(jī)制,使用的是臨時(shí)文件機(jī)制。多線程中的各個(gè)線程都是對(duì)各自(每個(gè)線程獨(dú)占一個(gè))的臨時(shí)文件寫,然后再同步到原文件中。
    2009-12-12
  • php的XML文件解釋類應(yīng)用實(shí)例

    php的XML文件解釋類應(yīng)用實(shí)例

    這篇文章主要介紹了php的XML文件解釋類及其應(yīng)用實(shí)例,包括針對(duì)XML文件的讀取、解釋、檢查及輸出等功能,非常實(shí)用,需要的朋友可以參考下
    2014-09-09
  • PHP使用 Imagick 擴(kuò)展實(shí)現(xiàn)圖片合成,圓角處理功能示例

    PHP使用 Imagick 擴(kuò)展實(shí)現(xiàn)圖片合成,圓角處理功能示例

    這篇文章主要介紹了PHP使用 Imagick 擴(kuò)展實(shí)現(xiàn)圖片合成,圓角處理功能,結(jié)合具體實(shí)例形式分析了PHP使用 Imagick 擴(kuò)展的圖形處理、生成相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • 如何讓thinkphp在模型中自動(dòng)完成session賦值小教程

    如何讓thinkphp在模型中自動(dòng)完成session賦值小教程

    在項(xiàng)目中遇到一個(gè)問題,需要讓thinkphp在模型中自動(dòng)完成session賦值,經(jīng)過一番研究,終于實(shí)現(xiàn),下面記錄一下,另附上thinkPHP的session的相關(guān)知識(shí)
    2014-09-09
  • PHP實(shí)現(xiàn)的抓取小說網(wǎng)站內(nèi)容功能示例

    PHP實(shí)現(xiàn)的抓取小說網(wǎng)站內(nèi)容功能示例

    這篇文章主要介紹了PHP實(shí)現(xiàn)的抓取小說網(wǎng)站內(nèi)容功能,涉及php頁面抓取、正則匹配、文件讀寫等相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • 文件系統(tǒng)基本操作類

    文件系統(tǒng)基本操作類

    文件系統(tǒng)基本操作類...
    2006-11-11
  • PHP結(jié)構(gòu)型模式之裝飾器模式

    PHP結(jié)構(gòu)型模式之裝飾器模式

    這篇文章主要介紹了PHP結(jié)構(gòu)型模式之裝飾器模式,裝飾器模式是一種結(jié)構(gòu)型模式,它允許你在運(yùn)行時(shí)為一個(gè)對(duì)象動(dòng)態(tài)地添加新的行為,而不影響其原始的行為。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它結(jié)合了透明性和多樣性
    2023-04-04

最新評(píng)論