ホームページ >バックエンド開発 >PHPチュートリアル >PHP は Tencent Cloud COS インターフェースに必要なリクエスト署名の関連コンテンツを生成します

PHP は Tencent Cloud COS インターフェースに必要なリクエスト署名の関連コンテンツを生成します

jacklove
jackloveオリジナル
2018-06-23 16:02:401752ブラウズ

この記事では、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]

リクエスト署名機能の概要

  • は、文字列

  • key=value のキーと値のペア形式です。キーは固定値

  • キーのペアは合計 7 つあります =value

  • sha1 もパラメータですが、正式リリースの時点では sha1 のみがサポートされているため、直接割り当てることができます

  • SignedHeaderList、SignedParameterList、および Signature の値をアルゴリズムを通じて生成する必要があります

Key-Value の詳細な説明については、ペアについては、公式ドキュメントを参照してください。

1 つずつ説明

署名をリクエストするには、合計 7 つの値が必要です。以下で 1 つずつ説明し、それぞれを説明します。

q-sign-algorithm

署名アルゴリズム、公式 現在サポートされているのは sha1 のみです。値を直接指定してください。

q-ak

ユーザーの SecretId であるアカウント ID は、コンソールで取得できます。 Cloud API Key ページ

q-sign-time

現在の署名の有効な開始時刻と終了時刻、Unix タイムスタンプ形式、英語の半角セミコロンで区切られた形式、1480932292;1481012298 など

q-key-time

q-sign-time valueと同じ

q-header-list

個人的な理解ですが、HTTPリクエストで構成されていますヘッダーを取得し、リクエストヘッダーの全部または一部を取得し、リクエストをkey:valueの形式に変更します。項目のキー部分を取り出し、小文字に変換し、複数のキーを辞書に従ってソートし、文字で接続します。 ; 最終的に文字列を形成します

たとえば、元のリクエスト ヘッダーには次の 2 つがあります:

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

Content -Type:image/jpeg

#key は Host と Content-Type です。操作後、
##q-url-param-list

が出力されます。

個人的な理解では、HTTP リクエスト パラメータで構成され、リクエスト パラメータのすべてまたは一部を取得し、リクエスト パラメータのキー部分を key=value の形式で取り出し、それを小文字に変換します。 複数のキーがソートされます。辞書、文字 ; で接続され、最終的に文字列に形成されます

たとえば、元の HTTP リクエストは次のとおりです:

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

key は prefix と max-keys です。リクエストに put や post などのパラメータがない場合は、max-keys;prefix が出力されます。 q-signature

HTTP コンテンツに基づいて署名を計算します。アルゴリズムは COS によって提供されます。必要に応じて値を指定するだけです。

公式の例と参照結果

開始する前にロジックを記述するには、公式のサンプルを参照してください。また、計算結果を自分で開発したロジックと比較するために、

HTTP の元のリクエストとしても理解できます。署名を計算する前、または署名が必要ない場合の HTTP リクエスト:

PUT /testfile2 HTTP/1.1

ホスト: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
ホスト: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=14e6ebd7955b0c6da532151bf97045e2c5a64e10

Hello world

結論: アルゴリズムが承認後にアルゴリズムを取得できるかどうか文字列 string は正しいです

準備作業

(公式に提供されている)ユーザー情報とHTTP情報を見てみましょう:

  • ##SecretId: AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q

  • SecretKey: BQYIM75p8x0iWVFSIgqEKwFprpRSVHlz

  • 署名の有効開始時刻: 1417773892

  • 署名の有効終了時刻: 1417853898

  • HTTP 元のリクエスト ヘッダー: 前のセクションの例によれば、HTTP 元のリクエストに次の 3 つのコンテンツがあることを取得するのは難しくありません: Host、x-cos-content-sha1および x-cos-storage-class

  • HTTP リクエスト パラメーター: これは PUT リクエストですか? パラメーター

署名の計算

すべてのパラメータを準備します。リクエスト署名ルールを導入すると、次の表に示すような結果を得るのは難しくありません。


Key (キー) Value(値)備考##q-sign-algorithmq-akq-sign-time q-key-timeq-header-listq-url-param-listq-signature

しかし、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 = &#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;
}

テスト用に、このメソッドには必要以上のパラメータが指定されている必要があります。最初の 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(&#39;;&#39;, $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]\n
StringToSign = [q-sign-algorithm]\n[q-sign-time]\nSHA1-HASH(HttpString)\n

Signature = HMAC-SHA1(SignKey,StringToSign)


もう一度、署名の完全なアルゴリズムを見てみましょう:

$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: 4 つの部分は次のとおりです。別途記載してください


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(&#39;&&#39;, $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 つの値があります。それらの一部はユーザー情報から取得され、一部は計算する必要があります。すべての計算方法とその理由を個人的に理解する必要があります。計算された値も上記に示されています。最後に、公式の要件に従って出力するだけです。見てください
sha1 現在サポートされている sha1 署名アルゴリズムのみ
AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q SecretId フィールド
1417773892;1417853898 2014/12/5 18:04:52 ~ 2014/12/6 16:18:18
1417773892;1417853898 2014/12/5 18:04:52 ~ 2014/12/6 16: 18:18
host;x-cos-content-sha1;x-cos-storage-class 辞書順HTTP ヘッダー キーの並べ替えられたリスト

HTTP パラメーター リストが空です
14e6ebd7955b0c6da532151bf97045e2c5a64e10 コードによる計算

以上がPHP は Tencent Cloud COS インターフェースに必要なリクエスト署名の関連コンテンツを生成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。