2017-09-13 3 views
1

Je travaille sur l'API azure rest pour obtenir des pages avec PHP. Je suis la documentation de l'API reste hereAuthenticationFailedServer n'a pas réussi à authentifier la requête dans azure

Je suis incapable d'authentifier l'API reste, il dit

La signature MAC trouvée dans la requête HTTP « 6fsdfhyuiz78 » est pas la même que toute signature calculée. Le serveur a utilisé la chaîne suivante pour signer GET

J'utilise le code ci-dessous pour obtenir les plages de pages. J'ai manqué quelque chose ici en passant les en-têtes de demande pour générer la chaîne pour signer la signature d'authentification. Ce serait génial si quelqu'un pouvait m'aider dans ce domaine.

$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

S'il vous plaît modifier votre question et inclure 2 choses: 1) sortie '$ stringtosign' et 2) corps de réponse. –

Répondre

0

Quelques choses que je remarqué:

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

S'il vous plaît changer V les valeurs de date/heure à T.

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

Basé sur le documentation, canonicalizedResource doit contenir des paramètres de la requête triée par ordre alphabétique. S'il vous plaît changer la ligne ci-dessus à:

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

Merci pour la réponse. Je reçois toujours la même erreur. – NKS

+0

Cela fonctionne maintenant. Presnapshot et l'instantané n'ont eu aucune différence, ont corrigé le problème en ajoutant quelques données sur le disque et ont pris l'instantané du disque encore. – NKS