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 servicesCible.
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'algorithmeComprendre la signature de la requête
Venez d'abord Regardez la signature de la demande donnée dans un document officielq-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
Hôte : bucket1-1254000000.cos.ap-beijing. myqcloud.com
Content-Type:image/jpegq-url-param-. listCompré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 :
la clé est Host et Content-Type Après l'opération, content-type;host
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
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
Hôte : bucket1-1254000000.cos.ap-beijing.myqcloud.com
x -cos-content-sha1 : 7b502c3a1f48c8609ae212cdfb639dee39673f5ex-cos-storage-class : standardLa requête HTTP que vous devriez recevoir après avoir calculé la signature :
Bonjour tout le mondePUT /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=14e6ebd7955b0c6da532151bf97045e2c5a64e10Bonjour 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 :
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-signature 14e6ebd7955b0c6da532151bf97045e2c5a64e10Calculé 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 :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 :/** * 计算签名 * 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; }Copier après la connexion$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ègleet 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
$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/** * 按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; } }Copier après la connexionCalcul 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$signTime = $qSignTime;StringToSign = [q-sign-algorithm ]n[q-sign-time]nSHA1-HASH(HttpString)n
Regardez à nouveau l'algorithme complet de Signature :
Signature = HMAC-SHA1(SignKey,StringToSign)$signKey = hash_hmac('sha1', $signTime, $secretKey);$signKey : l'algorithme HMAC-SHA1 peut être calculé directement$httpString = "$httpMethodn$httpUrin$httpParametersn$headerStringn";
$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
$sha1edHttpString = sha1($httpString);
$stringToSign = " sha1n$signTimen$sha1edHttpStringn";
$signature = hash_hmac('sha1', $stringToSign, $signKey);
$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('&', $headerArray); } catch(Exception $error){ return false; } }Copier après la connexionPourquoi 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
Résultats de sortie et vérification- . : q-header-list et q-url-param-list prennent uniquement la partie clé, HttpHeaders et HttpParameters prennent les parties clé et valeur
À 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!