2016-12-09 6 views
1

Возможно ли открыть доступ SAS ко всем блокам на одном лазурном контейнере?Azure SAS container php

Я могу создать SAS для конкретного блоба, но я пытаюсь сделать это для контейнера, и я не нашел хорошие варианты?

Моя цель - открыть конкретный доступ ко всему контейнеру и прочитать некоторые конкретные капли.

$end = date('Y-m-d\TH\:i\:s\Z', strtotime('+10 minutes')); 

$containerName=$_POST['container']; 
$blobName= $_POST['blob']; 

function getSASForBlob($accountName, $container, $blob, $permissions ,$expiry, $key){ 
/* Create the signature */ 
$_arraysign = array(); 
$_arraysign[] = $permissions; 
$_arraysign[] = ''; 
$_arraysign[] = $expiry; 
$_arraysign[] = '/blob/'.$accountName . '/' . $container . '/'; 
$_arraysign[] = ''; 
$_arraysign[] = ''; 
$_arraysign[] = ''; 
$_arraysign[] = "2015-12-11"; //the API version is now required 
$_arraysign[] = ''; 
$_arraysign[] = 'file; attachment'; 
$_arraysign[] = ''; 
$_arraysign[] = ''; 
$_arraysign[] = 'binary'; 

$_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[] = 'comp=list'; 


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

return $_url; 
} 


$sig = getSASForBlob("cloudviewer",$containerName, $blobName, "r", $end, $key); 
$url = getBlobUrl("cloudviewer",$containerName,$blobName,"c","r", $end, $sig); 

echo(json_encode(array('url' => $url, 'experity' => $end))); 

Моя ошибка:

Подпись не соответствует. Используемая строка для обозначения: r 2016-12-10T16: 53: 00Z/blob/cloudviewer/450-423-422-392 2015-12-11

+0

Вы получаете сообщение об ошибке HTTP, можете ли вы поделиться им, пожалуйста? Вы проверяли, что дата истечения срока действия находится в UTC? Согласно документации ваш код должен работать https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/constructing-a-service-sas –

+0

Я добавляю результат ошибки, дата-время является хорошим, потому что я использую то же самое для прямого доступа к определенному блобу. – Lilice

+0

Похоже, вы создаете токен службы SAS. Вместо этого вы можете попытаться создать токен SAS учетной записи. Я могу сказать, что это знак SAS службы, потому что там есть параметр sr. https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/Constructing-an-Account-SAS?redirectedfrom=MSDN –

ответ

0

Для создания достоверной услуги необходимо внести незначительные изменения SAS, который будет отображать капли в контейнере. Кроме того, при вызове этих методов вы должны передавать разрешения «rl» не только «r». Это связано с тем, что вы хотите перечислить элементы в контейнере.

$end = date('Y-m-d\TH\:i\:s\Z', strtotime('+10 minutes')); 

$containerName=$_POST['container']; 
$blobName= $_POST['blob']; 

function getSASForBlob($accountName, $container, $blob, $permissions ,$expiry, $key){ 
/* Create the signature */ 
$_arraysign = array(); 
$_arraysign[] = $permissions; 
$_arraysign[] = ''; 
$_arraysign[] = $expiry; 
$_arraysign[] = '/blob/' . $accountName . '/' . $container; 
$_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[] = 'comp=list'; 
$_parts[] = 'restype=container'; 




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

return $_url; 
} 
1

В моем тесте нам необходимо реализовать отдельные маркеры SAS для операций с блоками и контейнерами. Вы можете обратиться к https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/constructing-a-service-sas.

Для этой проблемы кажется, что вы генерируете URL-адрес токена SAS для списка blob в контейнере. Для быстрого тестирования, пожалуйста, попробуйте следующий фрагмент кода:

function getSASForBlob($accountName, $container, $blob, $permissions ,$expiry, $key){ 
/* Create the signature */ 
$_arraysign = array(); 
$_arraysign[] = $permissions; 
$_arraysign[] = ''; 
$_arraysign[] = $expiry; 
if($blob){ 
    $_arraysign[] = '/blob' .'/'.$accountName . '/' . $container . '/' . $blob; 
}else{ 
    $_arraysign[] = '/blob' .'/'.$accountName . '/' . $container ; 
} 
$_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){ 
$_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[] = 'comp=list'; 
    $_parts[] = 'restype=container'; 


/* 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, null, "l", $endDate, AZURE_PRIMARY_KEY); 
$url = getBlobUrl(AZURE_ACC_NAME,AZURE_CONTAINER,null,"c","l", $endDate, $sig); 
Смежные вопросы