この記事では、PHP を使用して COS インターフェイスを作成するために必要なリクエスト署名を主に紹介し、アルゴリズムが正しいかどうかを検証するために公式ドキュメントに示されている例と比較します。
COS とリクエスト署名とは
COS は Tencent Cloud Object Storage の略称であり、リクエスト署名はサードパーティがオンデマンドで提供する必要がある特定のアルゴリズムによって作成されます。 COS 関連インターフェイスの呼び出し。現在のサードパーティ ID を一意に識別し、両方の通信当事者の ID を提供する一連の文字列情報。
#目標
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]リクエスト署名機能の概要
Host:bucket1-1254000000.cos.ap-beijing.myqcloud.com##q-url-param-listContent -Type:image/jpeg
#key は Host と Content-Type です。操作後、
が出力されます。
個人的な理解では、HTTP リクエスト パラメータで構成され、リクエスト パラメータのすべてまたは一部を取得し、リクエスト パラメータのキー部分を key=value の形式で取り出し、それを小文字に変換します。 複数のキーがソートされます。辞書、文字 ; で接続され、最終的に文字列に形成されます たとえば、元の HTTP リクエストは次のとおりです:GET /?prefix=abc&max-keys=20
HTTP コンテンツに基づいて署名を計算します。アルゴリズムは COS によって提供されます。必要に応じて値を指定するだけです。公式の例と参照結果開始する前にロジックを記述するには、公式のサンプルを参照してください。また、計算結果を自分で開発したロジックと比較するために、HTTP の元のリクエストとしても理解できます。署名を計算する前、または署名が必要ない場合の HTTP リクエスト:key は prefix と max-keys です。リクエストに put や post などのパラメータがない場合は、max-keys;prefix が出力されます。 q-signature
PUT /testfile2 HTTP/1.1
ホスト:bucket1-1254000000.cos.ap-beijing.myqcloud.comx -cos-content-sha1: 7b502c3a1f48c8609ae212cdfb639dee39673f5e
x-cos-storage -class: standardHello world
署名の計算後に取得する必要がある HTTP リクエスト:PUT /testfile2 HTTP/1.1
ホスト: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-コンテンツ-sha1;x-cos-storage-class&q-url-param-list=&q-signature=14e6ebd7955b0c6da532151bf97045e2c5a64e10Hello world
結論: アルゴリズムが承認後にアルゴリズムを取得できるかどうか文字列 string は正しいです
準備作業
(公式に提供されている)ユーザー情報とHTTP情報を見てみましょう:
署名の計算
- ##SecretId: AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q
- SecretKey: BQYIM75p8x0iWVFSIgqEKwFprpRSVHlz
- 署名の有効開始時刻: 1417773892
- 署名の有効終了時刻: 1417853898
- HTTP 元のリクエスト ヘッダー: 前のセクションの例によれば、HTTP 元のリクエストに次の 3 つのコンテンツがあることを取得するのは難しくありません: Host、x-cos-content-sha1および x-cos-storage-class
- HTTP リクエスト パラメーター: これは PUT リクエストですか? パラメーター
すべてのパラメータを準備します。リクエスト署名ルールを導入すると、次の表に示すような結果を得るのは難しくありません。
Key (キー) ##q-sign-algorithmValue(値) 備考 q-ak sha1 現在サポートされている sha1 署名アルゴリズムのみ q-sign-time AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q SecretId フィールド q-key-time 1417773892;1417853898 2014/12/5 18:04:52 ~ 2014/12/6 16:18:18 q-header-list 1417773892;1417853898 2014/12/5 18:04:52 ~ 2014/12/6 16: 18:18 q-url-param-list host;x-cos-content-sha1;x-cos-storage-class 辞書順HTTP ヘッダー キーの並べ替えられたリスト q-signature
HTTP パラメーター リストが空です14e6ebd7955b0c6da532151bf97045e2c5a64e10 コードによる計算 しかし、Q 署名はどこから来たのでしょうか?
先ほど述べたように、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 = ''; //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=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; }ログイン後にコピーテスト用に、このメソッドには必要以上のパラメータが指定されている必要があります。最初の 6 つのパラメータは次のとおりです。ユーザーに直接値を割り当てて、次の文字列を取得します:
$authorization = "q-sign-algorithm=sha1&q-ak=$secretId&q-sign-time=$qSignTime&q-key-time =$qKeyTime...
$header_list この値は
q-header-list
ルールに準拠する必要があるため、ロジックは上記のとおりです。確立されたリクエスト項目からキーを抽出して、整然とした形式の文字列を形成します。コードは次のとおりです。/** * 按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 リクエスト パラメータです。当然、値は空なので、コードは「遅延」し、空の文字列を直接与えます。と注意点
公式がアルゴリズムやPHP、コードの書き方まで丁寧に解説してくれているので、大満足のはずです(でも! 公式ドキュメントを読んでめまいがしたので、後で説明します)、まず署名の「形式」を見てください:
SignKey = HMAC-SHA1(SecretKey,"[q-key-time]")
HttpString = [HttpMethod]\n[HttpURI]\n[HttpParameters]\n[HttpHeaders]\nStringToSign = [q-sign-algorithm]\n[q-sign-time]\nSHA1-HASH(HttpString)\nSignature = HMAC-SHA1(SignKey,StringToSign)
もう一度、署名の完全なアルゴリズムを見てみましょう:$signTime = $qSignTime;
$signKey = hash_hmac('sha1', $signTime, $secretKey);$httpString = "$httpMethod \n$httpUri\n$httpParameters\n$headerString\n";$httpString: 4 つの部分は次のとおりです。別途記載してください$sha1edHttpString = sha1( $httpString);
$stringToSign = "sha1\n$signTime\n$sha1edHttpString\n";
$signature = hash_hmac('sha1', $stringToSign, $signKey);
#$signTime: 非常に単純です。開始時刻と終了時刻で構成される文字列です。上から使用するだけです。
$signKey: HMAC-SHA1 アルゴリズムは直接計算できます
1、$httpMethod: HTTP リクエスト メソッド、小文字、例: put、get
2. $httpUri: 「/」仮想ルートから始まる HTTP リクエストの URI 部分。 /testfile はバケットのルートディレクトリに testfile というファイルを作成することを意味し、/image/face1.jpg はルートディレクトリ/image ディレクトリに testfile というファイルを作成することを意味します。が画像ファイルであるかどうかは関係ありません。 3, $httpParameters: ここが最初に注意すべき点です。 HTTP 本来のリクエストパラメータ、つまりリクエスト URI の ? 以降の部分で構成されています。この例では PUT Object インターフェイスを呼び出しているため、空になっています。空でない場合は、リクエスト パラメータの各項目のキーと値を小文字に変換する必要があります。key=value の複数のペアが辞書によってソートされ、$headerString: これが 2 番目です。注意点は、HTTP本来のリクエストヘッダーに応じて、リクエストヘッダーの全部または一部を選択し、各項目のキーを小文字に変換し、値をURLEncodeに変換し、それぞれの形式を変更します。 item を key=value に変換し、キーに従って並べ替えを行い、最後にコネクタ & を使用して文字列を形成します。これは私がコンパイルしたロジックです。コードは次のとおりです。/** * 按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 元のリクエスト ヘッダーとリクエスト パラメーターは 4 つの場所で使用されます。つまり、リクエスト署名の q-header-list と署名の HttpHeaders です。どちらも HTTP 元のリクエスト ヘッダー、q-url-param を使用します。 -list in Signature と HttpParameters in Signature - どちらも HTTP リクエスト パラメーターを使用します。選択した HTTP リクエスト ヘッダーとリクエスト パラメーターの数がオブジェクト と一致していることを必ず確認してください。q-header-list によって生成された HTTP リクエスト ヘッダーの数とメンバーは次のとおりです。 HttpHeaders の生成に使用されるものと同じである必要があります。q-url-param-list によって生成される HTTP リクエスト パラメーターの数とメンバーは、HttpParameters によって生成されるものと同じである必要があります。 q-header-list と q-url-param-list はキー部分のみを受け取り、HttpHeaders と HttpParameters はキー部分と値部分を受け取ります
出力結果と検証
- この時点で、リクエスト署名には 7 つの値があります。それらの一部はユーザー情報から取得され、一部は計算する必要があります。すべての計算方法とその理由を個人的に理解する必要があります。計算された値も上記に示されています。最後に、公式の要件に従って出力するだけです。見てください
以上がPHP は Tencent Cloud COS インターフェースに必要なリクエスト署名の関連コンテンツを生成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。