Maison  >  Article  >  développement back-end  >  PHP génère le contenu pertinent de la signature de demande requise par l'interface Tencent Cloud COS

PHP génère le contenu pertinent de la signature de demande requise par l'interface Tencent Cloud COS

jacklove
jackloveoriginal
2018-06-23 16:02:401705parcourir

Cet article présente principalement la signature de requête requise pour créer une interface COS en PHP. Elle est comparée aux exemples donnés dans les documents officiels pour vérifier l'exactitude de l'algorithme. Les amis dans le besoin peuvent s'y référer

Que sont les COS et les signatures de demande

COS est l'abréviation et l'abréviation de Tencent Cloud Object Storage. La signature de demande est créée par un algorithme spécifique et doit être fournie par un tiers sur. demande lors de l'appel des interfaces liées au COS. Un ensemble d'informations de chaîne qui identifieront de manière unique l'identité actuelle du tiers et fourniront l'identification des deux parties communicantes. Seul le COS signé valide fournira des services

Cible.

Utilisez PHP pour créer la signature de requête requise pour l'interface COS, comparez-la avec l'exemple donné dans le document officiel et vérifiez l'exactitude de l'algorithme

Comprendre la signature de la requête

Venez d'abord Regardez la signature de la demande donnée dans un document officiel

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]

Résumé de la demande caractéristiques de signature

  • est un format de paire clé-valeur d'une chaîne

  • key=value. 🎜>

    . Il y a 7 paires de clés au total. =value
  • sha1 est également un paramètre, mais depuis la version officielle, seul sha1 est pris en charge, vous pouvez donc attribuer directement trois valeurs :
  • SignedHeaderList, SignedParameterList et la valeur de signature doivent être générées via un algorithme
  • pour des descriptions détaillées. de paires clé-valeur, veuillez vous référer à la documentation officielle.
Cassurez-le une par une

Un total de 7 valeurs sont requises pour demander une signature. Ce qui suit expliquera une par une

q-sign. -algorithm

algorithme de signature, officiel Actuellement, seul sha1 est pris en charge, il suffit donc de donner directement la valeur

q-ak

L'ID de compte, qui est le SecretId de l'utilisateur, peut être obtenu sur la page Clé de l'API Cloud de la console

q-sign-time

L'heure de début et de fin valide de la signature actuelle, format d'horodatage Unix, point-virgule anglais divisé en demi-largeur, format ; tel que 1480932292;1481012298

q-key-time

Même valeur que q-sign-time

q-header-list

Compréhension personnelle, il se compose d'en-têtes de requête HTTP, prend tout ou partie des en-têtes de requête et modifie la requête sous la forme clé:valeur La partie clé de l'élément est supprimée, convertie en minuscules, plusieurs clés sont triées selon le dictionnaire , et connecté avec les caractères ; pour finalement former une chaîne

Par exemple, l'en-tête de la requête d'origine en contient deux :

Hôte : bucket1-1254000000.cos.ap-beijing. myqcloud.com

Content-Type:image/jpeg


la clé est Host et Content-Type Après l'opération, content-type;host

q-url-param-. list

Compréhension personnelle, elle se compose de paramètres de requête HTTP, prend tout ou partie des paramètres de requête, retire la partie clé du paramètre de requête sous la forme clé=valeur et la convertit en minuscule Multiple. les clés sont triées par dictionnaire et reliées par des caractères ; pour finalement former une chaîne

Par exemple, la requête HTTP originale est :

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

key est prefix et max-keys. Après l'opération, max-keys est généré si la requête n'a pas de paramètres tels que put et post, elle sera vide

<.>q-signature

Calculez la signature en fonction du contenu HTTP, l'algorithme est fourni par COS, donnez simplement la valeur requise

Exemples officiels et résultats de référence

Avant de commencer à écrire la logique, jetez un œil aux exemples officiels Valeur de référence, ainsi que les résultats calculés, afin de comparer les résultats avec la logique développée par vous-même

Requête originale HTTP, peut également être comprise comme la Requête HTTP avant de calculer la signature ou lorsqu'aucune signature n'est requise :

PUT /testfile2 HTTP/1.1

Hôte : bucket1-1254000000.cos.ap-beijing.myqcloud.com

x -cos-content-sha1 : 7b502c3a1f48c8609ae212cdfb639dee39673f5e
x-cos-storage-class : standard


Bonjour tout le monde

La requête HTTP que vous devriez recevoir après avoir calculé la signature :

PUT /testfile2 HTTP/1.1
Hôte : bucket1-1254000000.cos.ap-beijing.myqcloud.com
x-cos-content-sha1 : 7b502c3a1f48c8609ae212cdfb639dee39673f5e
x- stockage -class : standard
Autorisation : q-sign-algorithm=sha1&q-ak=AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q&> er-list=hôte;x-cos-content -sha1;x-cos-storage-class&q-url-param-list=&q-signature=14e6ebd7955b0c6da532151bf97045e2c5a64e10

Bonjour tout le monde

Conclusion : Si l'algorithme peut obtenir celui après autorisation La chaîne de caractères est correcte

Travail de préparation

Jetons un coup d'œil aux informations utilisateur (officiellement fournies) et aux informations HTTP :

  • SecretId : AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q

  • SecretKey : BQYIM75p8x0iWVFSIgqEKwFprpRSVHlz

  • Heure de début valide de la signature : 1417773892

  • Heure d'arrêt valide de la signature : 1417853898

  • En-tête de requête HTTP d'origine : D'après l'exemple de la section précédente, il n'est pas difficile d'obtenir que la requête HTTP d'origine ait trois contenus : Host, x-cos-content- sha1 et x-cos-storage-class

  • Paramètres de la requête HTTP : Est-ce une requête PUT, non ? Paramètres

Calculer la signature

préparera divers paramètres En intégrant les règles de signature de la demande, il n'est pas difficile d'obtenir les résultats, comme le montre le tableau suivant :


14e6ebd7955b0c6da532151bf97045e2c5a64e10
Clé (clé) Valeur (valeur) Remarques
q-sign-algorithm sha1 Actuellement, ne prend en charge que l'algorithme de signature sha1
q-ak AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q Champ SecretId
q-sign-time 1417773892;1417853898 2014/12/5 18:04:52 au 2014/12/6 16:18:18
q-key-time 1417773892;1417853898 5/12/2014 18:04 :52 au 6/12/2014 16:18:18
liste-q-en-tête host;x-cos-content-sha1;x -cos-storage-class liste lexicographique des clés d'en-tête HTTP
q -url-param-list
键(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 通过代码计算所得
La liste des paramètres HTTP est vide
q-signatureCalculé par code Revenu

Mais d’où vient la signature Q ?

Comme mentionné tout à l'heure, la q-signature doit également être calculée par un algorithme spécifique. Voici comment la calculer

Calculer la signature de la demande

<.>Regardez d'abord le code :

/**
 * 计算签名
 * 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;
}

Pour les tests, cette méthode devrait avoir plus de paramètres que nécessaire. Les six premiers paramètres ont été donnés et arrivent. de l'utilisateur. Par conséquent, vous pouvez obtenir la chaîne suivante par affectation directe :

$authorization = "q-sign-algorithm=sha1&q-ak=$secretId&q-sign-time=$qSignTime&q-key -time=$qKeyTime..

$header_list Cette valeur doit être conforme à la règle

et doit donc être calculée. La logique est celle décrite ci-dessus. Elle extrait les clés de la requête établie. éléments pour former une chaîne ordonnée Le code est le suivant : 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 Comme mentionné ci-dessus, cette valeur est une requête HTTP. Il n'y a pas de paramètre ? pour la méthode PUT, et la valeur naturelle est vide Donc le code est "paresseux" et donne directement la chaîne vide

Calcul de la signature et ce qu'il faut faire attention <.>Le officiel a donné un algorithme complet, PHP même. Il y a aussi le code écrit, je devrais être très content (mais ! J'avais le vertige après avoir lu le document officiel, mais j'ai quand même marché sur le piège. , et je l'expliquerai ensemble plus tard). Tout d'abord, jetez un œil au "format" de la 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)

Regardez à nouveau l'algorithme complet de Signature :

$signTime = $qSignTime;
$signKey = hash_hmac('sha1', $signTime, $secretKey);

$httpString = "$httpMethodn$httpUrin$httpParametersn$headerStringn";
$sha1edHttpString = sha1($httpString);
$stringToSign = " sha1n$signTimen$sha1edHttpStringn";
$signature = hash_hmac('sha1', $stringToSign, $signKey);

$signTime : très simple, une chaîne composée de l'heure de début et de fin, utilisez-le simplement directement à partir de ce qui précède
$signKey : l'algorithme HMAC-SHA1 peut être calculé directement


$httpString : les quatre parties doivent être séparées. Dites
1 $httpMethod : HTTP. méthode de requête, en minuscules, telle que put, get2. $httpUri : partie URI de la requête HTTP, à partir de la racine virtuelle "/", telle que /testfile Description dans le stockage Créez un fichier appelé testfile dans le répertoire racine de le bucket, /image/face1.jpg. Instructions : Créez un fichier appelé face1.jpg dans le répertoire racine/répertoire image, cela n'a pas d'importance
3. $httpParameters : Ceci Ceci. est le premier endroit où il faut être prudent. Il se compose des paramètres de requête HTTP d'origine, c'est-à-dire la partie après ? dans l'URI de la requête. Cet exemple appelle l'interface PUT Object, elle est donc vide. S'il n'est pas vide, vous devez convertir la clé et la valeur de chaque élément du paramètre de requête en minuscules. Plusieurs paires clé=valeur sont triées par dictionnaire et connectées avec &
4. $headerString : C'est le deuxième chose à laquelle il faut faire attention. , constitué des en-têtes de requête HTTP d'origine. Selon les en-têtes de requête, sélectionnez tout ou partie des en-têtes de requête, convertissez les clés de chaque élément en minuscules, convertissez les valeurs en URLEncode, changez le format. de chaque élément à key=value, puis procédez selon le tri par clé du dictionnaire, et enfin utilisez le connecteur & pour former une chaîne. C'est la logique que j'ai compilée. Le code est le suivant :

/**
 * 按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;
 }
}

Pourquoi devriez-vous faire attention ?

Les en-têtes de requête HTTP originaux et les paramètres de requête sont utilisés à quatre endroits, à savoir q-header-list dans la signature de la requête et HttpHeaders dans la signature - tous deux utilisent l'en-tête de requête HTTP original q-url-param ; -list dans Signature et HttpParameters dans Signature - tous deux utilisent des paramètres de requête HTTP. Assurez-vous de vous assurer que le nombre et les objets sélectionnés pour les en-têtes de requête HTTP et les paramètres de requête sont les mêmes

     : le nombre et les membres des en-têtes de requête HTTP générés par q-header-list doivent être les mêmes que ceux générés par HttpHeaders. Le nombre et les membres des paramètres de requête HTTP générés par q-url-param-list doivent être les mêmes que ceux générés par HttpParameters
  • . : q-header-list et q-url-param-list prennent uniquement la partie clé, HttpHeaders et HttpParameters prennent les parties clé et valeur
Résultats de sortie et vérification

À ce stade, les 7 valeurs de la signature de la demande sont incluses. Certaines d'entre elles proviennent des informations de l'utilisateur et d'autres doivent être calculées. Toutes les méthodes de calcul et la compréhension personnelle des raisons pour lesquelles elles sont calculées sont. également donné ci-dessus. Enfin, il vous suffit de produire selon les exigences officielles. Jetez un oeil

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn