婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP生成騰訊云COS接口需要的請求簽名

PHP生成騰訊云COS接口需要的請求簽名

熱門標簽:福建銀行智能外呼系統價格 遼寧ai電銷機器人價格 上海做外呼線路的通信公司 寧波外呼營銷系統 四川保險智能外呼系統供應商 房產中介用的是什么外呼系統 長沙做地圖標注公司 電話機器人銷售主要負責什么 地圖標注專員怎么樣

COS和請求簽名是什么

COS 是騰訊云對象存儲的縮寫及簡稱,請求簽名是第三方在調用COS相關接口時需要按需提供的、經過特定算法創建而成的一組字符串信息,將唯一的標識當前第三方身份,提供通信雙方的身份識別,只有有效的簽名COS才會提供服務

目標

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

認識請求簽名

先來看一條官方文檔給出的請求簽名的樣子

q-sign-algorithm=sha1q-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;host

q-url-param-list

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

如原始HTTP請求為:

GET /?prefix=abcmax-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: 7b502c3a1f48c8609ae212cdfb639dee39673f5e
x-cos-storage-class: standard

Hello world

計算簽名后應該得到的HTTP請求:

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=sha1q-ak=AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q> q-sign-time=1417773892;1417853898q-key-time=1417773892;1417853898q-header-list=host;x-cos-content-sha1;x-cos-storage-classq-url-param-list=q-signature=14e6ebd7955b0c6da532151bf97045e2c5a64e10

Hello world

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

準備工作

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

  • SecretId:AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q
  • SecretKey:BQYIM75p8x0iWVFSIgqEKwFprpRSVHlz
  • 簽名有效起始時間:1417773892
  • 簽名有效停止時間:1417853898
  • HTTP原始請求頭:根據上一節示例不難得到HTTP原始請求有三項內容 Host、x-cos-content-sha1 和 x-cos-storage-class
  • HTTP請求參數:是 PUT 請求,沒有 ? 參數

計算簽名

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

鍵(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 參數列表為空
q-signature 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_timestunix_timestamp
 $qKeyTime = $qSignTime;

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

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

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

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

 // 計算簽名中的 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);
 //組合結果
 $authorization = "q-sign-algorithm=sha1q-ak=$secretIdq-sign-time=$qSignTimeq-key-time=$qKeyTimeq-header-list=$header_listq-url-param-list=$url_param_listq-signature=$signature";
 return $authorization;
}

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

$authorization = "q-sign-algorithm=sha1q-ak=$secretIdq-sign-time=$qSignTimeq-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(';', $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=valuekey=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('', $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個值都有了,有的是來自用戶信息,有的需要計算,需要計算的上面也給出了所有的計算方法和為什么如此計算的個人理解。最后只需要按照官方要求進行輸出即可。看一下🌰,在PostMan中選擇Post方法,選擇form-data方式提交數據,在Body中給出所有用戶參數(這個地方為了測試算法是否與官方一直,所以幾乎所有的值都是Post提交上去的,實際時間、Host都可以在算法中創建)

提交后,返回結果

字很小,單獨把結果提取出來

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

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

吐槽和反思

version 0.2

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

version 0.1

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

標簽:張家口 巴中 梅州 林芝 成都 威海 泰州 山東

巨人網絡通訊聲明:本文標題《PHP生成騰訊云COS接口需要的請求簽名》,本文關鍵詞  PHP,生成,騰訊,云,COS,接口,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP生成騰訊云COS接口需要的請求簽名》相關的同類信息!
  • 本頁收集關于PHP生成騰訊云COS接口需要的請求簽名的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲国产综合在线| 欧美一区二区三区免费视频| 久久99蜜桃精品| 日日夜夜精品免费视频| 亚洲va国产天堂va久久en| 亚洲一二三四在线| 亚洲超碰97人人做人人爱| 亚洲福利视频一区二区| 视频一区视频二区中文字幕| 美女一区二区三区| 国产一区亚洲一区| jlzzjlzz欧美大全| 色欧美乱欧美15图片| 在线日韩av片| 日韩亚洲欧美成人一区| 国产视频不卡一区| 中文字幕一区二区不卡| 亚洲成av人片在线观看无码| 蜜臀av一区二区| 国产盗摄视频一区二区三区| 一本一道久久a久久精品| 欧美色偷偷大香| 欧美va亚洲va香蕉在线| 国产精品私人自拍| 亚洲va在线va天堂| 国产综合色在线| 在线日韩一区二区| 久久综合久久久久88| 亚洲图片激情小说| 男女男精品视频网| 粉嫩aⅴ一区二区三区四区| 在线亚洲免费视频| 久久亚洲精华国产精华液 | 亚洲午夜日本在线观看| 日本欧美在线观看| 成人激情视频网站| 91精品国产综合久久精品app | 国产成人精品午夜视频免费| jlzzjlzz国产精品久久| 777xxx欧美| 亚洲天堂精品视频| 国产一区二区三区综合| 欧洲色大大久久| 国产精品日韩精品欧美在线| 亚洲福中文字幕伊人影院| 成人高清视频在线| 欧美精品一区二区高清在线观看| 亚洲精品国产无天堂网2021| 国产一区二区精品在线观看| 337p亚洲精品色噜噜| 一区二区三区中文字幕精品精品 | 国产亚洲一区二区在线观看| 亚洲成人第一页| 色综合视频在线观看| 国产网站一区二区三区| 蜜桃视频在线观看一区二区| 欧美日韩中文字幕一区| 国产精品久久久久久久午夜片| 久久精品二区亚洲w码| 欧美在线不卡一区| 亚洲另类春色国产| 91小视频免费观看| 亚洲品质自拍视频| av在线播放一区二区三区| 国产校园另类小说区| 国内成人精品2018免费看| 日韩一区二区在线观看| 亚洲.国产.中文慕字在线| 欧美三级韩国三级日本三斤| 亚洲九九爱视频| 99久久99久久综合| 中文字幕在线一区免费| aaa欧美色吧激情视频| 欧美精彩视频一区二区三区| 国产在线播放一区二区三区| 26uuu欧美| 成人97人人超碰人人99| 国产精品美女久久久久av爽李琼| 国产suv精品一区二区三区| 久久久久久久综合色一本| 国产成人自拍网| 国产精品色婷婷久久58| 色94色欧美sute亚洲线路二| 亚洲成人一区二区在线观看| 91精品啪在线观看国产60岁| 精品一区二区三区在线视频| 久久久亚洲午夜电影| 国产一区二区三区免费在线观看| 欧美激情资源网| 在线视频国产一区| 蜜桃av一区二区在线观看| 久久久国产综合精品女国产盗摄| k8久久久一区二区三区| 天天色天天操综合| 久久这里只精品最新地址| a级精品国产片在线观看| 亚洲一区二区三区自拍| 欧美mv和日韩mv国产网站| 成人网页在线观看| 午夜久久久久久久久| 2023国产精品视频| 91传媒视频在线播放| 狠狠色丁香婷婷综合久久片| 国产精品国产三级国产普通话蜜臀 | 91色porny蝌蚪| 日本特黄久久久高潮| 国产精品入口麻豆九色| 精品视频一区三区九区| 国产成+人+日韩+欧美+亚洲| 午夜精品久久久久久不卡8050| 久久久久久久综合日本| 欧美日产国产精品| 成人高清视频免费观看| 欧美a级理论片| 亚洲精品欧美激情| 久久久久亚洲蜜桃| 欧美一区二区人人喊爽| 91亚洲大成网污www| 国产成人在线视频免费播放| 日本在线不卡一区| 亚洲综合色网站| 国产精品国产精品国产专区不蜜 | 福利视频网站一区二区三区| 香蕉久久夜色精品国产使用方法| 亚洲国产精品99久久久久久久久| 91精品在线观看入口| 在线精品视频免费播放| 成人小视频在线| 国内不卡的二区三区中文字幕| 丝袜美腿亚洲色图| 一区二区三区四区不卡视频| 国产精品嫩草影院com| 精品国产亚洲在线| 日韩欧美中文字幕精品| 欧美日韩成人一区二区| 欧洲生活片亚洲生活在线观看| 成人中文字幕在线| 成人在线视频首页| 成人丝袜高跟foot| 大胆欧美人体老妇| 国产精品综合久久| 国产精品伊人色| 黄页网站大全一区二区| 免费成人在线视频观看| 首页国产欧美久久| 日本中文字幕一区| 老司机免费视频一区二区三区| 日韩一区精品字幕| 欧美aaa在线| 国产在线精品一区二区三区不卡| 久久99在线观看| 国产揄拍国内精品对白| 国产在线乱码一区二区三区| 国产乱码精品一区二区三区av | 成人黄色软件下载| www.久久精品| 欧美亚一区二区| 制服丝袜国产精品| 久久综合久久久久88| 国产精品三级av| 亚洲欧美日韩电影| 日韩av一区二区三区| 国内精品国产成人国产三级粉色| 成人精品视频网站| 91官网在线免费观看| 欧美一区二区在线视频| 久久一区二区三区四区| 成人免费一区二区三区在线观看| 日韩一区欧美小说| 亚洲成人av在线电影| 黑人巨大精品欧美一区| 波多野结衣中文字幕一区二区三区| 日本高清不卡一区| 精品99999| 一区二区免费在线播放| 看国产成人h片视频| 91在线视频网址| 欧美一区二区久久| 自拍偷自拍亚洲精品播放| 日韩和欧美的一区| 99视频国产精品| 欧美大胆人体bbbb| 一区二区三区在线看| 精品一区二区免费| 色婷婷久久一区二区三区麻豆| 日韩亚洲欧美中文三级| 亚洲欧美一区二区三区久本道91| 日韩va亚洲va欧美va久久| 成人久久久精品乱码一区二区三区| 欧美欧美午夜aⅴ在线观看| 亚洲国产精品黑人久久久| 日韩电影一区二区三区| 99re这里只有精品首页| 久久综合色一综合色88| 亚洲国产三级在线| 91在线精品一区二区| 久久久亚洲午夜电影| 蜜桃视频在线观看一区| 欧美日韩高清一区二区| 亚洲卡通欧美制服中文|