Azure PHP SAS для BLOB-объектов

Я пытаюсь создать SAS для моего хранилища BLOB-объектов, но я получаю сообщение о том, что мои поля подписи не правильно сформированы.

Сначала функция, которая создает подпись:

function getSASForBlob($accountName,$container, $blob, $resourceType, $permissions, $expiry,$key){

/* Create the signature */
$_arraysign = array();
$_arraysign[] = $permissions;
$_arraysign[] = '';
$_arraysign[] = $expiry;
$_arraysign[] = '/' . $accountName . '/' . $container . '/' . $blob;
$_arraysign[] = '';
$_arraysign[] = "2014-02-14"; //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)
);
}

Затем функция, которая предоставляет мне URL:

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=2014-02-14';

/* Create the signed blob URL */
$_url = 'https://'
.$accountName.'.blob.core.windows.net/'
. $container . '/'
. $blob . '?'
. implode('&', $_parts);

return $_url;
}

Затем я вызываю функции и уточняю параметры.

$container = '87d57f73-a327-4344-91a4-27848d319a66';
$blob = '8C6CBCEB-F962-4939-AD9B-818C124AD3D9.mp4';
$endDate = date('YYYY-MM-DDThh:mmTZD', strtotime('+1 day'));

$_signature = getSASForBlob($accountName,$container,$blob,'b','r',$endDate,$accountKey);
$_blobUrl = getBlobUrl($accountName,$container,$blob,'b','r',$endDate,$_signature);

https://ttresources.blob.core.windows.net/87d57f73-a327-4344-91a4-27848d319a66/8C6CBCEB-F962-4939-AD9B-818C124AD3D9.mp4?se=2016201620162016-FebFeb-ThuThuCET1111%3A0202CET3600Thu&SR = Ь&зр = г&сиг = 1VdOjLX179wLQv5o265JBR% 2B6CaLTr1nwCs6GHSVqfbA% 3D&св = 2014-02-14

Это URL-адрес, который я получаю в результате, когда я следую за ним, я получаю следующее сообщение об ошибке:

AuthenticationFailed Серверу не удалось
аутентифицировать запрос. Убедитесь, что значение заголовка авторизации
составлено правильно, включая подпись.
RequestID: 41f089a3-0001-0027-376f-6966d1000000
Время: 2016-02-17T10: 38: 00.2724783Z Поля подписи не очень хорошо
формируется.

2

Решение

Поскольку проблема в том, что вы сделали неправильный формат даты и времени. По словам руководство:

Поля Signstart и Signedexpiry должны быть выражены как время UTC и должны соответствовать действительному формату ISO 8601. Поддерживаемые форматы ISO 8601 включают следующее:

  • YYYY-MM-DD
  • YYYY-MM-DDThh: mmTZD
  • YYYY-MM-DDThh: мм: ssTZD

А в PHP вы должны создать дату и время в следующем формате:

$expiry = date('Y-m-d\TH:i:s\Z', strtotime('+1 day'));

Тогда это будет правильный формат.

1

Другие решения

Есть проблема в том, как вы строите canonicalizedresource, Пожалуйста, удалите / до $accountName из этой строки:

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

Так и должно быть:

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

На основании документации here:

URL = https://myaccount.blob.core.windows.net/music/intro.mp3
canonicalizedresource = "myaccount/music/intro.mp3"
0

По вопросам рекламы [email protected]