Подпись SAS Azure не совпала

Я пытаюсь создать SAS для blob на лазурной памяти в php. Я пишу следующий код:

$key ="..."; $end = date('Ymd\TH\:i\:s\Z', strtotime('+1 day')); function getSASForBlob($accountName, $container, $blob, $permissions ,$expiry, $key){ /* Create the signature */ $_arraysign = array(); $_arraysign[] = $permissions; $_arraysign[] = ''; $_arraysign[] = $expiry; $_arraysign[] = '/'.$accountName . '/' . $container . '/' . $blob; $_arraysign[] = ''; $_arraysign[] = "2015-12-11"; //the API version is now required $_arraysign[] = ''; $_arraysign[] = ''; $_arraysign[] = ''; $_arraysign[] = ''; $_arraysign[] = ''; $_str2sign = implode("\n", $_arraysign); return base64_encode(hash_hmac('sha256', urldecode(utf8_encode($_str2sign)), base64_decode($key), true)); } function getBlobUrl($accountName, $container, $blob, $resourceType, $permissions, $expiry, $_signature){ /* Create the signed query part */ $_parts = array(); $_parts[] = 'sv=2015-12-11'; $_parts[] = 'ss=b'; $_parts[] = 'srt=' . $resourceType; $_parts[] = (!empty($permissions))?'sp=' . $permissions:''; $_parts[] = (!empty($expiry))?'se=' .$expiry:''; $_parts[] = 'spr=https'; $_parts[] = 'sig=' . urlencode($_signature); /* Create the signed blob URL */ $_url = 'https://' .$accountName.'.blob.core.windows.net/' . $container . '/' . $blob . '?' . implode('&', $_parts); return $_url; } $sig = getSASForBlob("cloudviewer","450-423-422-392", "thumbnail.jpeg", "r", $end, $key); $url = getBlobUrl("cloudviewer","450-423-422-392","thumbnail.jpeg","o","r", $end, $sig); echo(json_encode(array('url' => $url, 'sig' => $sig, 'expiry' => $end))); 

результат, который я получил: https://cloudviewer.blob.core.windows.net/450-423-422-392/thumbnail.jpeg?sv=2015-12-11&ss=b&srt=o&sp=r&se=2016- 12-09T17: 08: 25Z & SPR = HTTPS & сиг = BU6lfFljKLsmK8zPdHny5qRU9XStpE97Pud5vj4biEY% 3D

с ошибкой аутентификации: подпись не соответствует. Используемая строка для обозначения была облачной областью rbo 2016-12-09T17: 08: 25Z https 2015-12-11

Я создаю SAS прямо из Azure, и у меня был url https://cloudviewer.blob.core.windows.net/450-423-422-392/thumbnail.jpeg?sv=2015-12-11&ss=b&srt=o&sp= r & se = 2016-12-09T17: 28: 32Z & st = 2016-12-08T15: 28: 32Z & spr = https & sig = EgnmcRSSKol% 2BqR2A4aBdFhL9dmkhGJVHOw9W% 2BC8% 2FTKI% 3D, который работает и похож на первый.

Я уже пытаюсь

 $_arraysign[] = '/blob/'.$accountName . '/' . $container . '/' . $blob; $_arraysign[] = $accountName . '/' . $container . '/' . $blob; 

Есть ли у вас какие-либо идеи ?

благодаря

Кажется, что вы пытаетесь создать токен SAS учетной записи, поскольку второй пример описан на https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-shared-access-signature-part-1 # examples-of-sas-uris . По моему пониманию, вы можете генерировать общий маркер SAS BLOB в качестве первого примера, упомянутого в вышеприведенной статье.

Между тем, в соответствии с описанием Constructing String Signature , вы пропустили несколько частей при создании подписи.

Итак, попробуйте следующий фрагмент кода:

 function getSASForBlob($accountName, $container, $blob, $permissions ,$expiry, $key){ /* Create the signature */ $_arraysign = array(); $_arraysign[] = $permissions; $_arraysign[] = ''; $_arraysign[] = $expiry; $_arraysign[] = '/blob' .'/'.$accountName . '/' . $container . '/' . $blob; $_arraysign[] = ''; $_arraysign[] = ''; $_arraysign[] = ''; $_arraysign[] = "2015-12-11"; //the API version is now required $_arraysign[] = ''; $_arraysign[] = ''; $_arraysign[] = ''; $_arraysign[] = ''; $_arraysign[] = ''; $_str2sign = implode("\n", $_arraysign); return base64_encode(hash_hmac('sha256', urldecode(utf8_encode($_str2sign)), base64_decode($key), true)); } function getBlobUrl($accountName, $container, $blob, $resourceType, $permissions, $expiry, $_signature){ /* Create the signed query part */ $_parts = array(); $_parts[] = (!empty($expiry)) ? 'se=' . urlencode($expiry) : ''; $_parts[] = 'sr=' . $resourceType; $_parts[] = (!empty($permissions)) ? 'sp=' . $permissions : ''; $_parts[] = 'sig=' . urlencode($_signature); $_parts[] = 'sv=2015-12-11'; $_parts[] = 'rscd='; /* Create the signed blob URL */ $_url = 'https://' .$accountName.'.blob.core.windows.net/' . $container . '/' . $blob . '?' . implode('&', $_parts); return $_url; } $sig = getSASForBlob(AZURE_ACC_NAME,AZURE_CONTAINER, BLOB, "r", $endDate, AZURE_PRIMARY_KEY); $url = getBlobUrl(AZURE_ACC_NAME,AZURE_CONTAINER,BLOB,"b","r", $endDate, $sig);