2017-09-13 4 views
1

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); 
+0

질문을 편집하고 1)'$ stringtosign '출력 및 2) 응답 본문을 포함하십시오. –

답변

0

몇 가지 내가주의 :

$mypremiumdisk_ss1 = "2017-09-12V09:15:43.00001Z"; 
$mypremiumdisk_ss2 = "2017-09-12V09:55:47.00002Z"; 

T에 날짜/시간 값에 V을 변경하시기 바랍니다. documentation을 바탕으로

$canonicalizedResource = "/$account_name/$containername/$blob\ncomp:pagelist\nsnapshot:$mypremiumdisk_ss1\nprevsnapshot:$mypremiumdisk_ss2"; 

canonicalizedResource 포함해야 쿼리 매개 변수는 알파벳 순으로 정렬. 위의 내용을 다음과 같이 변경하십시오 :

$canonicalizedResource = "/$account_name/$containername/$blob\ncomp:pagelist\nprevsnapshot:$mypremiumdisk_ss2\nsnapshot:$mypremiumdisk_ss1"; 
+0

응답 해 주셔서 감사합니다. 나는 여전히 같은 오류가 발생합니다. – NKS

+0

이제 작동 중입니다. Presnapshot과 스냅 샷은 차이가 없었으며 디스크에 데이터를 추가하여 문제를 해결했으며 디스크의 스냅 샷을 다시 가져 왔습니다. – NKS