目錄
如原始HTTP請求為:
官方範例及參考結果
HTTP原始請求,也可以理解為計算簽名前或不需要簽名時的HTTP請求:
首頁 後端開發 php教程 PHP產生騰訊雲COS介面所需的請求簽名的相關內容

PHP產生騰訊雲COS介面所需的請求簽名的相關內容

Jun 23, 2018 pm 04:02 PM
cos php 請求簽名

這篇文章主要介紹了使用PHP 創建COS 接口所需要的請求簽名,與官方文檔給出的示例做比較,驗證算法的正確性,需要的朋友可以參考下

COS與請求簽章是什麼

COS 是騰訊雲物件儲存的縮寫及簡稱,請求簽章是第三方在呼叫COS相關介面時需要按需提供的、經過特定演算法建立而成的一組字串訊息,將唯一的標識當前第三方身份,提供通訊雙方的身份識別,只有有效的簽名COS才會提供服務

##目標

#使用PHP 建立COS 介面所需的請求簽名,與官方文件給出的範例做比較,驗證演算法的正確性

認識請求簽章##先來看一條官方文件給出的請求簽名的樣子

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]

##請求簽名特徵總結

#是一串字串
  • key=value的鍵值對格式,key為固定值
  • 總共有7對key =value
  • sha1也是參數,但截止到官方發文只支援sha1,因此可以直接賦值
  • SignedHeaderList、SignedParameterList、Signature三個value需要透過演算法產生
  • 鍵值對的具體描述參見官方文件。
逐一擊破

請求簽名一共需要7個值,下面一一講解,各個擊破

q-sign-algorithm

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

q-ak

帳戶ID,即使用者的SecretId,可以在控制台 雲API金鑰 頁面取得

q-sign-time

目前簽章的有效起止時間,Unix時間戳記格式,英文半角分號 ; 分割,格式如 1480932292;1481012298

q-key-time

#與q-sign-time 值相同

q-header-list

個人理解,由HTTP請求頭組成,取全部或部分請求頭,將 key:value 形式的請求項目的key 部分取出,轉換小寫,多個key 按字典排序,以字元 ; 連接,最終組成字串

如原始請求頭有兩個:

Host: bucket1-1254000000.cos.ap-beijing.myqcloud.com

Content-Type:image/jpeg


key 就是Host 和Content-Type,運算後輸出 content-type;

##q-url-param-list

個人瞭解,由HTTP請求參數組成,取全部或部分請求參數,將 key=value 形式的請求參數的key 部分取出,轉換小寫,多個key 依字典排序,以字元 ; 連接,最終組成字串

如原始HTTP請求為:

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

key 是prefix 和max-keys,經過運算後輸出 max-keys;prefix,如果請求沒有參數例如put、post,此處即為空

q-signature

根據HTTP內容計算簽名,演算法由COS提供,只需按要求給值

官方範例及參考結果

在開始編寫邏輯之前,先看一下官方範例給出的參考值,以及經過計算後的結果,以便和自己開發的邏輯進行結果比對

HTTP原始請求,也可以理解為計算簽名前或不需要簽名時的HTTP請求:

PUT /testfile2 HTTP/1.1

Host: bucket1-1254000000.cos.ap-beijing.myqcloud.com

x-cos-content-sha1: 7b502c3a1f48c8609cosae#212136099613609cos -class: standard

Hello world


計算簽章後應該得到的HTTP請求:

PUT /testfile2 HTTP/1.1
Host: bucket1-1254000000.cos.ap-beijing.myqcloud.com
x-cos-content-sha1: 7b502c3a1f48c8609cosae#212136099613609cos -class: standard
Authorization: q-sign-algorithm=sha1&q-ak=AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q&> q-sign-time=1417773892;1417853898827853898273892;1417853898838738298989382020982-200098382-20982-200982-2098209838200982-200983029000989300 =host;x-cos-content -sha1;x-cos-storage-class&q-url-param-list=&q-signature=14e6ebd7955b0c6da532151bf97045e2c5a64e10

Hello world

結論:算法如果能得到Authorization 後的那一字串字串即為正確

準備工作

來看一下(官方提供的)使用者資訊以及HTTP資訊:

  • SecretId:AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q

  • SecretKey:BQYIM75p8x0iWVFSIgqEKwFprpRSVHlz

  • 簽名有效起始時間:1417773892

  • 簽名有效時間:1417773892

  • 簽名有效時間: 1417853898

  • HTTP原始請求頭:根據上一節範例不難得到HTTP原始請求有三個內容Host、x-cos-content-sha1 和x-cos-storage-class

HTTP請求參數:是PUT 請求,沒有?參數

計算簽章

##將準備工作中的各項參數帶入請求簽章規則,不難就可以得到結果,如下表:

##值(value)備註q-sign-algorithmsha1目前僅支援sha1 簽章演算法q-akAKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q#SecretId 欄位##1417773892;14178538981417773892;1417853898 #q-header-listhost;x-cos-content-sha1;x-cos-storage-classq-url-param-listHTTP 參數清單為空q-signature
2014/12/5 18:04:52 到2014/12/6 16:18:18 q- key-time
2014/12/5 18:04:52 到2014/12/6 16:18:18

HTTP 頭部key 的字典順序排序清單
###14e6ebd7955b0c6da532151bf97045e2c5a64e10######透過程式計算所得#############

但 q-signature 怎麼來的?

剛才說到,q-signature 也需要特定演算法計算得來,以下就說明如何計算

計算請求簽章

##先看程式碼:

/**
 * 计算签名
 * secretId、secretKey 为必需参数,qSignStart、qSignEnd为调试需要,测试通过后应取消,改为方法内自动创建
 */
function get_authorization( $secretId, $secretKey, $qSignStart, $qSignEnd, $fileUri, $headers ){
 /* 
 * 计算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 中带有 ?的请求参数,该处应为数组排序后的字符串组合
 $url_param_list = &#39;&#39;;

 //compute signature
 $httpMethod = &#39;put&#39;;
 $httpUri = $fileUri;

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

 //将自定义请求头分解为 & 连接的字符串
 $headerString = get_http_header_string( $headers );

 // 计算签名中的 signature 部分
 $signTime = $qSignTime;
 $signKey = hash_hmac(&#39;sha1&#39;, $signTime, $secretKey);
 $httpString = "$httpMethod\n$httpUri\n$httpParameters\n$headerString\n";
 $sha1edHttpString = sha1($httpString);
 $stringToSign = "sha1\n$signTime\n$sha1edHttpString\n";
 $signature = hash_hmac(&#39;sha1&#39;, $stringToSign, $signKey);
 //组合结果
 $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;
}
登入後複製

為了測試,該方法參數應該是多過需要了,前六個參數是已經給出的,是來自用戶的,因此直接賦值即可得到下邊字串:

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

$header_list 這個值要符合

q-header-list 規則因此需要計算,邏輯是上文已經描述,是從既定的請求項中抽出key 組成有序字串,程式碼如下:

/**
 * 按COS要求对header_list内容进行转换
 * 提取所有key
 * 字典排序
 * key转换为小写
 * 多对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(&#39;;&#39;, $tmpArray);
 }
 catch(Exception $error){
  return false;
 }
}
登入後複製

$url-param-list 上面講過,這個值是HTTP請求參數,對於PUT 方法沒有? 參數,自然值為空,所以程式碼中「偷懶」直接給了空字串。

Signature 的計算和需要小心的地方##官方已經給出了完整的演算法,PHP 甚至還有寫好的程式碼,應該是很幸福了(但!由於看官方文件看的頭暈還是踩了坑,隨後一起說明),先看一下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:很簡單,起止時間組成的字串,從上文拿來直接用
$ signKey:HMAC-SHA1 演算法直接計算即可


$httpString:四個部分組成需要分開說
1、$httpMethod:HTTP請求方法,小寫,例如put、get# 2、$httpUri:HTTP請求的URI部分,從「/」虛擬根開始,如/testfile 說明在儲存桶根目錄下建立一個叫testfile 的文件,/image/face1.jpg 說明在根目錄/image目錄下建立一個叫face1.jpg 的文件,至於是不是圖片文件,不管
3、$httpParameters:這是第一個需要小心的地方。由HTTP原始請求參數組成,即請求 URI 中 ? 後面的部分,本例調用的是 PUT Object 接口,因此為空。如果不為空,需要把請求參數每一項的key 和value 均轉換小寫,多對key=value 按字典排序並以& 相連接
4、$headerString:這是第二個需要小心的地方,由HTTP 原始請求頭組成,根據請求頭,選擇全部或部分請求頭,把每項的key都轉換為小寫,把value都進行URLEncode轉換,每項格式都改為key=value,然後按照key進行字典排序,最後把它們用連接符號& 組成字串。這是我整理的邏輯,程式碼如下:

/**
 * 按COS要求从数组中获取 Signature 中 [HttpString] 内容
 * 标准格式 key=value&key=value&... 
 * 数组元素按键字典排序 * 
 * key转换为小写
 * value进行UrlEncode转换
 * 转换为key=value格式
 * 多对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(&#39;&&#39;, $headerArray);
 }
 catch(Exception $error){
  return false;
 }
}
登入後複製

為什麼要小心?

HTTP原始請求頭和請求參數用在了四個地方,分別是請求簽名裡的q-header-list 和Signature 裡的HttpHeaders——兩者都用到了HTTP原始請求頭;請求簽名裡的q-url-param-list 和Signature 裡的HttpParameters-兩者都用到了HTTP請求參數。一定要確保HTTP請求頭和請求參數所選用的數量和物件一致

    相同:產生q-header-list 的HTTP請求頭數和成員要和產生HttpHeaders 的相同,產生q-url-param-list 的HTTP請求參數數量和成員要和產生HttpParameters 的相同
  • 不同:q-header-list 和q-url-param-list 只取key 部分,HttpHeaders 和HttpParameters 取key 和value 部分
輸出結果和校驗

至此,請求簽章中7個值都有了,有的是來自用戶訊息,有的需要計算,需要計算的上面也給出了所有的計算方法和為什麼如此計算的個人理解。最後只需要按照官方要求輸出即可。看一下

以上是PHP產生騰訊雲COS介面所需的請求簽名的相關內容的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

說明匹配表達式(PHP 8)及其與開關的不同。 說明匹配表達式(PHP 8)及其與開關的不同。 Apr 06, 2025 am 12:03 AM

在PHP8 中,match表達式是一種新的控制結構,用於根據表達式的值返回不同的結果。 1)它類似於switch語句,但返回值而非執行語句塊。 2)match表達式使用嚴格比較(===),提升了安全性。 3)它避免了switch語句中可能的break遺漏問題,增強了代碼的簡潔性和可讀性。

為何Pantera等頂級風投押注Altius?揭秘模塊化執行層如何破解區塊鏈性能瓶頸 為何Pantera等頂級風投押注Altius?揭秘模塊化執行層如何破解區塊鏈性能瓶頸 Mar 04, 2025 pm 06:30 PM

Altius,一家加密初創公司,近日宣布完成1100萬美元融資,由FoundersFund和PanteraCapital領投。令人矚目的是,Altius在融資消息公佈前僅發布過一條推文,這為其增添了神秘感。究竟是什麼吸引了PanteraCapital等頂級風投機構?答案在於Altius對區塊鏈執行層的創新性重塑。 Altius並非一個傳統的單一公鏈項目,它致力於構建一個模塊化的、即插即用的執行層解決方案——AltiusStack。該解決方案能夠與任何採用虛擬機(VM)機制的公鏈無縫集成

Mocaverse地板價突破2.9ETH 24小時漲幅高達79%! NFT回溫? Mocaverse地板價突破2.9ETH 24小時漲幅高達79%! NFT回溫? Mar 05, 2025 pm 02:48 PM

NFT市场回暖迹象!Mocaverse地板价飙升,24小时涨幅高达79%根据OpenSea数据显示,知名NFT项目Mocaverse地板价近期突破2.9ETH,目前价格为2.96ETH(约合11860美元),24小时涨幅惊人,达到79%,最高甚至触及3.49ETH。这一显著增长引发市场广泛关注,NFT市场是否将重现牛市盛况?Mocaverse地板价走势图NFT板块领涨加密市场Coingecko数据显示,过去24小时内,加密市场整体上涨,而NFT板块以8.53%的涨幅位列榜首。部分项目表现尤为

c語言多線程的四種實現方式 c語言多線程的四種實現方式 Apr 03, 2025 pm 03:00 PM

語言多線程可以大大提升程序效率,C 語言中多線程的實現方式主要有四種:創建獨立進程:創建多個獨立運行的進程,每個進程擁有自己的內存空間。偽多線程:在一個進程中創建多個執行流,這些執行流共享同一內存空間,並交替執行。多線程庫:使用pthreads等多線程庫創建和管理線程,提供了豐富的線程操作函數。協程:一種輕量級的多線程實現,將任務劃分成小的子任務,輪流執行。

如何在macOS上將apscheduler定時任務配置為服務? 如何在macOS上將apscheduler定時任務配置為服務? Apr 01, 2025 pm 06:09 PM

在macOS上將apscheduler定時任務配置為服務在macOS平台上,如果你想將apscheduler定時任務配置為一個服務,類似於ngin...

See all articles