gpt4 book ai didi

php - Azure SAS 容器 PHP

转载 作者:行者123 更新时间:2023-12-03 03:09:09 25 4
gpt4 key购买 nike

是否可以打开对一个 Azure 容器上的整个 Blob 的 SAS 访问?

我可以为特定的 blob 创建 SAS,但我正在尝试为容器执行此操作,但找不到好的选择?

我的目标是打开对整个容器的特定访问权限并能够读取一些特定的 blob。

$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)));

我的错误是:

Signature did not match. String to sign used was r 2016-12-10T16:53:00Z /blob/cloudviewer/450-423-422-392 2015-12-11

最佳答案

在我的测试中,我们需要为 blob 和容器操作实现单独的 SAS token 。您可以引用https://learn.microsoft.com/en-us/rest/api/storageservices/fileservices/constructing-a-service-sas了解详情。

对于此问题,您似乎正在为容器中的列表 blob 生成 SAS token URL。为了快速测试,请尝试以下代码片段:

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

关于php - Azure SAS 容器 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41062884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com