2016-12-08 20 views
1

私は、PHPの空のストレージ上のBLOBにSASを作成しようとしました。 は、私は、次のコードを記述します。SAS Azureの署名が一致しませんでした

$key ="..."; 

$end = date('Y-m-d\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))); 

私が受け取った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:08:25Z&spr=https&sig=BU6lfFljKLsmK8zPdHny5qRU9XStpE97Pud5vj4biEY%3D

:署名が一致しませんでした。私はアズールから直接SASを作成して、私が動作し、最初の1に似て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 を持っていた25Z httpsを2015年12月11日

:08:使用に署名するための文字列cloudviewerのRBO 2016-12-09T17ました。

私はすでにあなたが任意のアイデアを持っていますか

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

みては?

おかげ

答えて

0

あなたがhttps://docs.microsoft.com/en-us/azure/storage/storage-dotnet-shared-access-signature-part-1#examples-of-sas-urisで説明した第二の例として、アカウントSASトークンを生成しようとしているようです。私の理解では、上記の記事で触れた最初の例として、共通のBLOB SASトークンを生成することしかできません。

一方、Constructing the Signature Stringの説明によれば、署名を生成するときにいくつかの部分が欠けていました。

ので、次のコードスニペットを試してください。それが動作

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

おかげで、私は同じことを行うために、今しようとしますが、コンテナ全体のために、私の「B」(resourcetypeの) "でいます容器のための "c"それは動作しません。 – Lilice

関連する問題