2016-12-09 7 views
1

1つの紺碧のコンテナのブロブ全体にSASアクセスを開くことは可能ですか?Azure SASコンテナphp

私は特定のBLOBに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

エラーの結果を追加します。datetimeは良いものですが、私は同じブロブに直接アクセスするために同じものを使用するからです。 – Lilice

+0

サービスのSASトークンを作成しているようです。代わりにAccount SASトークンを作成してみてください。そこにsrパラメータがあるので、サービスSASトークンだと言えます。 https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/建設--an-Account-SAS/redirectedfrom=MSDN –

答えて

0

有効なサービスを生成するためには少し変更する必要がありますコンテナ内のBLOBをリストするSASトークン。また、これらのメソッドを呼び出すときは、 'r'だけでなく 'rl'のパーミッションを渡すべきです。これは、コンテナ内のアイテムを一覧表示する必要があるためです。私のテストで

$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を参照してください。

この問題は、コンテナ内のBLOBリストのSASトークン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); 
関連する問題