>  기사  >  백엔드 개발  >  PHP는 Tencent Cloud COS 인터페이스에 필요한 요청 서명 관련 콘텐츠를 생성합니다.

PHP는 Tencent Cloud COS 인터페이스에 필요한 요청 서명 관련 콘텐츠를 생성합니다.

jacklove
jacklove원래의
2018-06-23 16:02:401644검색

이 글에서는 PHP를 사용하여 COS 인터페이스를 생성하는 데 필요한 요청 서명을 주로 소개합니다. 알고리즘의 정확성을 확인하기 위해 공식 문서에 제공된 예제와 비교하세요. 서명

COS는 Tencent Cloud Object Storage의 약자로, COS 관련 인터페이스를 호출할 때 제3자가 요청 시 제공해야 하는 특정 알고리즘에 의해 생성된 문자열 정보 집합입니다. 유효한 서명 COS만이 서비스를 제공합니다

Goal

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 키-값 쌍 형식이고, 키는 고정 값입니다.
  • key=value의 7쌍이 있습니다
  • sha1도 매개변수이지만 정식 릴리즈에서는 sha1만 지원하므로 직접 할당 가능
  • SignedHeaderList, SignedParameterList, Signature 세 가지 값은 알고리즘을 통해 생성되어야 함
  • 키에 대한 구체적인 설명은 공식 문서를 참조하세요. -값 쌍.
하나씩 깨기

서명을 요청하려면 총 7개의 값이 필요합니다. 각

q-sign-algorithm

서명 알고리즘을 깨기 위해 아래에서 하나씩 설명하겠습니다. 공식에서는 sha1만 지원하므로 그냥 주면 됩니다. 값을 직접

q-ak

계정 ID, 즉 사용자의 SecretId는 콘솔의 Cloud API Key 페이지에서 확인할 수 있습니다

q-sign-time

현재 서명, Unix 타임스탬프 형식, 영어 반각 세미콜론, 형식은 다음과 같습니다. 1480932292;1481012298

q-key-time

q-sign-time과 동일한 값

q-header-list

Personal 이해하면 HTTP 요청 헤더로 구성되며 요청 헤더의 전부 또는 일부를 가져와 키:값 형식을 사용합니다. 요청 항목의 키 부분을 꺼내어 소문자로 변환하고 사전에 따라 여러 키를 정렬하고 문자로 연결하여 최종적으로 문자열을 형성합니다

예를 들어 원래 요청 헤더에는

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

Content-Type: image/jpeg


키는 호스트 및 콘텐츠 유형입니다.

q-url-param-list

개인 이해, 요청 매개변수의 전부 또는 일부를 가져옵니다. 요청 매개변수의 핵심 부분을 key=value 형식으로 추출하고, 이를 소문자로 변환하고, 여러 키를 사전별로 정렬하고, 문자 ;로 연결하고, 마지막으로 문자열을 형성합니다

예를 들어 원래 HTTP 요청은 다음과 같습니다. :

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

key는 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-co s-스토리지 클래스: 표준

Hello world

는 서명 HTTP 요청을 계산한 후에 얻어야 합니다.

PUT /testfile2 HTTP/1.1
호스트: bucket1-1254000000.cos.ap-beijing.myqcloud.com
x-cos-content-sha1: 7b502c3a1f48c8609ae212cdfb639dee39673f5e
x-cos-storage-class: 표준
인증: q-sign -algorithm=sha1&q-ak=AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q&> q-sign-time=1417773892;1417853898&q-key-time=1417773892;1417853898&q-header-list=host;x-cos-content-sha1;x- co s-스토리지 클래스&q-url -param-list=&q-signature=14e6ebd7955b0c6da532151bf97045e2c5a64e10

Hello world

결론: Authorization

Preparation

(공식적으로 제공되는) 사용자 정보를 살펴보겠습니다. 그리고 HTTP 정보:

  • SecretId: AKIDQjz3ltompVjBni5LitkWHFlFpwkn9U5q

  • SecretKey: BQYIM75p8x0iWVFSIgqEKwFprpRSVHlz

  • 서명 유효 시작 시간: 1417773892

  • 서명 유효 중지 시간: 1417853898

  • HTTP 원래 요청 헤더: 위의 내용에 따름 Host, x-cos-content-sha1 및 x-cos-storage-class

  • HTTP 요청 매개변수: 매개변수가 없는 PUT 요청입니다.

서명 계산

준비 작업의 다양한 매개 변수를 요청 서명 규칙에 넣으면 다음 표와 같이 쉽게 결과를 얻을 수 있습니다.


HTTP 매개변수 목록이 비어 있습니다코드로 계산
Key(key) Value (값) Remarks
q-sign-algorithm sha1 현재 sha1 서명 알고리즘만 지원
q-ak AKIDQjz3ltompVjBni5LitkWHFlF pwkn9U5q SecretId 필드
q-sign- 시간 1417773892;1417853898 2014/12/5 18:04:52 ~ 2014/12/6 16:18:18
q-key-time 1417773892;1417853 898 2014/12/5 18:04:52 ~ 2014/12/6 16:18:18
q-header-list host; q-url-param-list

q-서명
14e6ebd7955b0c6da532151bf97045e2c5a64e10

그런데 q-signature는 어디서 왔나요?

방금 언급했듯이 q-서명도 특정 알고리즘으로 계산해야 합니다. 계산 방법은 다음과 같습니다.

요청 서명 계산

코드를 먼저 살펴보세요.

/**
 * 计算签名
 * 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 요청 매개변수가 없습니다. PUT 메소드의 ? 매개변수는 비어 있으므로 코드에서 "lazy"가 직접 제공됩니다.

서명 계산 및 주의해야 할 사항

알고리즘, PHP가 코드까지 작성했으니 매우 기쁠 것입니다(하지만 공식 문서를 보면 여전히 현기증이 나므로 나중에 함께 설명하겠습니다). 먼저 서명의 "형식"을 살펴보세요.

SignKey = HMAC -SHA1(비밀키, "[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 = "$httpMethodn$httpUrin$httpParametersn$headerStringn";
$sha1edHttpString = sha1($httpString);
$stringToSign = "sha1n$signTimen$sha1edHttpStringn";
$signature = hash_hmac('sha1', $stringToSign, $signKey);

$signTime: 매우 간단하며 시작 및 종료 시간으로 구성됩니다. 문자열은 위에서 가져오며
$signKey: HMAC-SHA1 알고리즘을 사용하여 직접 계산할 수 있습니다.
$httpString: 네 부분은 별도로 언급해야 합니다.
1. $httpMethod: put , get과 같은 소문자 $httpUri: HTTP 요청의 URI 부분입니다. "/" 가상 루트, 예를 들어 /testfile은 버킷의 루트 디렉터리에 testfile이라는 파일을 생성한다는 의미이고, /image/face1.jpg는 루트 디렉터리에 testfile이라는 파일을 생성한다는 의미/ image 디렉터리. 이미지 파일인지 아닌지는 중요하지 않습니다. 3. $httpParameters: 먼저 주의해야 할 곳입니다. 이는 HTTP 원래 요청 매개변수, 즉 요청 URI에서 ? 뒤의 부분으로 구성됩니다. 이 예제에서는 PUT 객체 인터페이스를 호출하므로 비어 있습니다. 비어 있지 않은 경우 요청 매개변수의 각 항목의 키와 값을 소문자로 변환해야 합니다. 여러 쌍의 키=값이 사전별로 정렬되어 &로 연결됩니다. HTTP 원본 요청 헤더 구성에 따라 요청 헤더 전체 또는 일부를 선택하고, 각 항목의 키를 소문자로 변환하고, 값을 URLEncode로 변환하고, 각 항목의 형식을 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 원본 요청 헤더와 요청 매개변수는 요청 서명의 q-header-list와 서명의 HttpHeaders 등 네 곳에서 사용됩니다. 둘 다 요청 서명 url-param-list의 HTTP 원본 요청 헤더 q-를 사용합니다. 및 서명의 HttpParameters - 둘 다 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.