PHP를 사용하여 페이지 범위를 가져 오는 azure rest API를 개발 중입니다. 나는 그것이 HTTP 요청 '6fsdfhyuiz78'에서 발견AuthenticationFailedServer가 azure에서 요청을 인증하지 못했습니다.
MAC 서명이 어떤 계산 된 서명과 동일하지 않습니다라고 나는 나머지 API를 인증 할 수없는 나는 나머지 API 문서 here
을 다음입니다. 서버에서 다음 문자열을 사용하여 서명 GET
아래 코드를 사용하여 페이지 범위를 가져옵니다. 요청 헤더를 전달하면서 인증 서명에 서명 할 문자열을 생성하는 동안 여기서 뭔가를 놓쳤습니다. 누군가가 나를 도울 수 있다면 좋을 것입니다.
$date = gmdate('D, d M Y H:i:s \G\M\T');
$account_name = "account name";
$containername = "container name";
$blob = "blobname.vhd";
$mypremiumdisk_ss1 = "2017-09-12V09:15:43.00001Z";
$mypremiumdisk_ss2 = "2017-09-12V09:55:47.00002Z";
$account_key = "account key";
$canonicalizedHeaders = "x-ms-date:$date\nx-ms-version:2015-07-08";
$canonicalizedResource = "/$account_name/$containername/$blob\ncomp:pagelist\nsnapshot:$mypremiumdisk_ss1\nprevsnapshot:$mypremiumdisk_ss2";
$arraysign = array();
$arraysign[] = 'GET'; /*HTTP Verb*/
$arraysign[] = ''; /*Content-Encoding*/
$arraysign[] = ''; /*Content-Language*/
$arraysign[] = ''; /*Content-Length (include value when zero)*/
$arraysign[] = ''; /*Content-MD5*/
$arraysign[] = ''; /*Content-Type*/
$arraysign[] = ''; /*Date*/
$arraysign[] = ''; /*If-Modified-Since */
$arraysign[] = ''; /*If-Match*/
$arraysign[] = ''; /*If-None-Match*/
$arraysign[] = ''; /*If-Unmodified-Since*/
$arraysign[] = ''; /*Range*/
$arraysign[] = $canonicalizedHeaders; /*CanonicalizedHeaders*/
$arraysign[] = $canonicalizedResource; /*CanonicalizedResource*/
$stringtosign = implode("\n", $arraysign);
$signature = 'SharedKey'.' '.$account_name.':'.base64_encode(hash_hmac('sha256', $stringtosign, base64_decode($account_key), true));
$endpoint = 'https://'.$account_name.'.blob.core.windows.net';
echo $url = $endpoint.'/'.$containername.'/'.$blob.'?comp=pagelist&snapshot='.$mypremiumdisk_ss1.'&prevsnapshot='.$mypremiumdisk_ss2;
$headers = [
"x-ms-date:{$date}",
'x-ms-version:2015-07-08',
'Accept:application/json;odata=nometadata',
'Accept-Charset:UTF-8',
"Authorization:{$signature}"
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
echo curl_error($ch);
curl_close($ch);
echo '<pre>';print_r($response);
질문을 편집하고 1)'$ stringtosign '출력 및 2) 응답 본문을 포함하십시오. –