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

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

Jun 23, 2018 pm 04:02 PM
cos php 署名を要求する

この記事では、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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) 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。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 Apr 06, 2025 am 12:03 AM

PHP8では、一致式は、式の値に基づいて異なる結果を返す新しい制御構造です。 1)Switchステートメントに似ていますが、実行ステートメントブロックの代わりに値を返します。 2)一致式の式は厳密に比較され、セキュリティが向上します。 3)スイッチステートメントの脱落の可能性を回避し、コードのシンプルさと読みやすさを向上させます。

なぜパンテラのようなトップベンチャーキャピタリストがアルティウスに賭けているのですか?モジュラー実行レイヤーがどのようにブロックチェーンのパフォーマンスボトルネックを割るかの秘密を明らかにする なぜパンテラのようなトップベンチャーキャピタリストがアルティウスに賭けているのですか?モジュラー実行レイヤーがどのようにブロックチェーンのパフォーマンスボトルネックを割るかの秘密を明らかにする Mar 04, 2025 pm 06:30 PM

CryptoのスタートアップであるAltiusは最近、FoundersFundとPantera Capitalが率いる1,100万ドルの資金調達ラウンドを発表しました。 Altiusが資金調達ニュースの発表前に1つのツイートしか投稿していないことは注目に値します。パンテラキャピタルなどのトップベンチャーキャピタル機関と正確に魅了されるものは何ですか?答えは、Altiusのブロックチェーン実行レイヤーの革新的な再形成にあります。 Altiusは、伝統的な単一のパブリックチェーンプロジェクトではありません。このソリューションは、仮想マシン(VM)メカニズムを使用して、あらゆるパブリックチェーンとシームレスに統合できます

MoCaverseの床価格は2.90を超え、24時間で最大79%増加しました! nftウォーミングアップ? MoCaverseの床価格は2.90を超え、24時間で最大79%増加しました! nftウォーミングアップ? Mar 05, 2025 pm 02:48 PM

NFT市場での回復の兆候! Mocaverse Floor価格は急上昇し、OpenSeaのデータによると、最大79%の増加があり、有名なNFTプロジェクトMoCaverseのフロア価格は2.96を超えており、現在の価格は約3.49%の24時間増加し、最大3.49%に達します。この大幅な成長は、NFT市場が強気市場に戻ってくるのでしょうか? Mocaverse Floor Price Chart NFTセクターは、Crypto Market Coingeckoのデータをリードしており、Crypto市場全体が過去24時間で上昇し、NFTセクターは8.53%の増加でリストの上にあることを示しています。一部のプロジェクトは特に良いです

マルチスレッドをC言語で実装する4つの方法 マルチスレッドをC言語で実装する4つの方法 Apr 03, 2025 pm 03:00 PM

言語のマルチスレッドは、プログラムの効率を大幅に改善できます。 C言語でマルチスレッドを実装する4つの主な方法があります。独立したプロセスを作成します。独立して実行される複数のプロセスを作成します。各プロセスには独自のメモリスペースがあります。擬似マルチスレッド:同じメモリ空間を共有して交互に実行するプロセスで複数の実行ストリームを作成します。マルチスレッドライブラリ:pthreadsなどのマルチスレッドライブラリを使用して、スレッドを作成および管理し、リッチスレッド操作機能を提供します。 Coroutine:タスクを小さなサブタスクに分割し、順番に実行する軽量のマルチスレッド実装。

APSChedulerタイミングタスクをMACOSのサービスとして構成する方法は? APSChedulerタイミングタスクをMACOSのサービスとして構成する方法は? Apr 01, 2025 pm 06:09 PM

nginと同様に、APSChedulerタイミングタスクをサービスとして構成する場合、APSChedulerタイミングタスクをMACOSプラットフォームでサービスとして構成します...

See all articles