2016-02-17 78 views
2

我試圖爲我的azure blob存儲創建一個SAS,但我收到消息說我的簽名字段沒有正確形成。Azure PHP 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=b&sp=r&sig=1VdOjLX179wLQv5o265JBR%2B6CaLTr1nwCs6GHSVqfbA%3D&sv=2014-02-14

這是網址,我得到我的結果是,當我跟着它我得到一個錯誤信息:

AuthenticationFailed服務器無法 驗證請求。確保授權標頭 的值正確形成,包括簽名。 請求ID:41f089a3-0001-0027-376f-6966d1000000 時間:2016-02-17T10:38:00.2724783Z簽名域不好 組成。

回答

0

您在構建的方式存在問題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

此修改仍然得到相同的結果 – Jeroen

+0

我注意到的另一件事是URL中的'se'參數('2016201620162016-FebFeb-ThuThuCET1111%3A0202CET3600Thu')。您能否檢查一下您是否通過了SAS期滿的適當價值? –

1

由於問題是,你所做的錯誤的日期時間格式。根據guide

的signedstart和signedexpiry領域必須表示爲UTC時間,必須堅持有效的ISO 8601格式。支持ISO 8601的格式包括以下內容:

  • YYYY-MM-DD
  • YYYY-MM-DDTHH:mmTZD
  • YYYY-MM-DDTHH:MM:ssTZD

而且在PHP中,您應該創建以下格式的日期時間:

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

然後它會是正確的格式。