亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

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

2020-03-22 17:57:30
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了使用 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=html' target='_blank'>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=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: 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=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

結論:算法如果能得到 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-algorithmsha1目前僅支持 sha1 簽名算法q-akAKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5qSecretId 字段q-sign-time1417773892;14178538982014/12/5 18:04:52 到 2014/12/6 16:18:18q-key-time1417773892;14178538982014/12/5 18:04:52 到 2014/12/6 16:18:18q-header-listhost;x-cos-content-sha1;x-cos-storage-classHTTP 頭部 key 的字典順序排序列表q-url-param-list
HTTP 參數列表為空q-signature14e6ebd7955b0c6da532151bf97045e2c5a64e10通過代碼計算所得

但 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:http://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 =  //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$httpUri$httpParameters$headerString  $sha1edHttpString = sha1($httpString); $stringToSign = sha1$signTime$sha1edHttpString  $signature = hash_hmac( sha1 , $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( , $tmpArray); catch(Exception $error){ return false;}

 

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

Signature 的計算和需要小心的地方

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

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

再看一下 Signature 的完整算法:

$signTime = $qSignTime;
$signKey = hash_hmac( sha1 , $signTime, $secretKey);
$httpString = $httpMethod $httpUri $httpParameters $headerString
$sha1edHttpString = sha1($httpString);
$stringToSign = sha1 $signTime $sha1edHttpString
$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( , $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個值都有了,有的是來自用戶信息,有的需要計算,需要計算的上面也給出了所有的計算方法和為什么如此計算的個人理解。最后只需要按照官方要求進行輸出即可??匆幌?/p>

以上就是PHP生成騰訊云COS接口需要的請求簽名的相關內容的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品动漫100p| 亚洲国模精品私拍| 欧美亚洲午夜视频在线观看| 欧美黄色三级网站| 亚洲男人7777| 精品国产欧美一区二区五十路| 伦伦影院午夜日韩欧美限制| 亚洲人成电影网| 国产丝袜一区视频在线观看| 国产精品美女主播在线观看纯欲| 国产精品对白刺激| 理论片在线不卡免费观看| 久久中国妇女中文字幕| 91地址最新发布| 国产成人综合久久| 91视频-88av| 国产日韩欧美黄色| 国产精品av网站| 欧美精品一二区| 国产成人精品在线视频| 亚洲自拍小视频免费观看| 国产日韩欧美电影在线观看| 欧美一区二区三区图| 日韩av理论片| 亚州欧美日韩中文视频| 欧美午夜精品久久久久久人妖| 国产精品日韩av| 欧美成人全部免费| 欧美成人精品一区二区三区| 久久影视电视剧免费网站清宫辞电视| 色无极影院亚洲| 久久精品国产一区二区电影| 97国产真实伦对白精彩视频8| 欧美日韩成人精品| 亚洲电影免费在线观看| 国产精品成人在线| 国产一区二区三区在线免费观看| 日本国产欧美一区二区三区| 亚洲xxx大片| 中文字幕视频在线免费欧美日韩综合在线看| 88国产精品欧美一区二区三区| 亚洲三级黄色在线观看| 久久成人精品一区二区三区| 国产精品99免视看9| 久久99久国产精品黄毛片入口| 日韩美女在线播放| 国语自产精品视频在免费| 影音先锋欧美在线资源| 69**夜色精品国产69乱| 成人黄色av免费在线观看| 成人在线小视频| 日韩不卡在线观看| 欧美极品第一页| 久久久国产在线视频| 亚洲视频在线观看网站| 久久免费少妇高潮久久精品99| 欧美巨乳在线观看| 亚洲三级 欧美三级| 性色av一区二区三区在线观看| 亚洲人成啪啪网站| 亚洲日韩欧美视频一区| 日韩在线视频网| 亚洲精品videossex少妇| 亚洲人成在线播放| 亚洲欧美在线一区二区| 日韩亚洲第一页| 亚洲人成毛片在线播放| 欧美精品在线网站| 国语自产精品视频在线看一大j8| 两个人的视频www国产精品| 大荫蒂欧美视频另类xxxx| 亚洲性线免费观看视频成熟| 欧美精品久久久久久久| 伊人伊成久久人综合网小说| 久久琪琪电影院| 97视频在线观看亚洲| 亚洲自拍偷拍在线| 九九热精品视频在线播放| 国产精品爽爽爽爽爽爽在线观看| 国产精品女人久久久久久| 日韩中文字幕在线观看| 国产精品久久久久久久天堂| 国产精品久在线观看| 4438全国亚洲精品在线观看视频| 不卡av电影在线观看| 欧美日韩中文字幕| 国产69精品久久久久99| 欧美在线视频在线播放完整版免费观看| 91精品国产高清久久久久久91| 国产欧美精品一区二区三区介绍| 中文字幕精品久久| 欧美精品免费在线观看| 国产一区二区三区在线播放免费观看| 亚洲免费影视第一页| 精品视频在线播放| 欧美日韩精品在线播放| 97av在线视频免费播放| 38少妇精品导航| 久久久999精品视频| 97久久久免费福利网址| 国产一区二区日韩| 91精品视频在线播放| 国产精品美女久久| 久久久久久久久久久成人| 久久精品91久久久久久再现| 欧美成人h版在线观看| 国产美女直播视频一区| 久久精品久久久久电影| 2019中文字幕在线免费观看| 亚洲人永久免费| 亚洲欧美日韩精品久久奇米色影视| 欧美亚洲成人网| 亚洲一区二区精品| 国产一区二区日韩精品欧美精品| 国产成人精品视| 91免费电影网站| 欧美日本啪啪无遮挡网站| 国产精品视频久久久久| 色老头一区二区三区在线观看| 亚洲美女性视频| 欧美xxxx综合视频| 亚洲成人av在线播放| 久久成人精品视频| 欧美肥老妇视频| 欧美一级大片在线免费观看| 欧美日韩福利在线观看| 日韩av网址在线| 中文字幕在线亚洲| 国语自产精品视频在线看| 亚洲已满18点击进入在线看片| 91国产中文字幕| 性欧美暴力猛交69hd| 91国产视频在线| 亚洲第一国产精品| 欧美精品videos另类日本| 日韩精品极品在线观看| 欧美一级视频在线观看| 久久久久久久久中文字幕| 国产精品国产三级国产aⅴ9色| 国产精品视频免费在线| 国产精品你懂得| 欧美精品videos性欧美| 深夜成人在线观看| 亚洲人成电影网站色xx| 欧美人在线视频| 国产成人综合精品| 色综合久久久久久中文网| 成人高h视频在线| 日韩免费观看av| 久久久久www| 青青在线视频一区二区三区| 日韩视频永久免费观看| 久久香蕉国产线看观看网| 久久精品国产99国产精品澳门| 欧洲一区二区视频| 欧美韩国理论所午夜片917电影| 欧美中文字幕第一页| 国产精品久久久久91| 亚洲免费电影在线观看| 精品福利在线视频| 国产精自产拍久久久久久| 日韩视频在线一区| 亚洲石原莉奈一区二区在线观看| 97色在线播放视频|