前一篇已經介紹了如何在 azure portal 後台建立 blob storage,而如果要讓程式或其他人可以直接存取檔案而非透過後台的話,就需要有存取金鑰或是存取簽章,本篇教學如何取得存取金鑰與存取簽章。
相關文章:
[教學] Azure Blob Storage 使用指南 – 創建篇
[教學] Azure Blob Storage 使用指南 – 金鑰與存取簽章篇
[教學] Azure Blob Storage 使用指南 – RESTful API 存取篇
存取金鑰
存與金鑰是每個 storage accoutn 中最重要的,其權限可以用於存取所有 storage account 內所有 container 內容以及簽署出共用存取簽章 (SAS)
要取得金鑰可以在進入 storage 管理頁面後點左邊的 [存取金鑰] 可以取得 storage account 的金鑰 (機碼),每個 storage account 都會有兩把金鑰選擇要用哪一把都可以
共用存取簽章 (shared access signature SAS)
共用存取簽章是透過存取金鑰簽署出來的有期限之簽章,管理員可以依據情境簽署能存取的範圍以及權限,有兩種的類型的簽章:一是 container 等級的簽章,二是 blob 等級的簽章,container 等級的簽章可以對 container 內所有 blob 進行操作,甚至寫資料至 container 內任何位置,而 blob 等級則只能操作指定 container 內指定位置的 blob,在寫入資料也只能寫到該指定位置,下面會教學幾個取得簽章的方法。
※ 存取簽章是透過存取金鑰簽署出來的,所以當管理員存取金鑰在後台重新產生新的金鑰後,舊的金鑰所簽署的簽章會馬上失效並且無法再使用。
權限說明
在簽署簽章時,需要設定該簽章能夠使用的權限,相關說明如下:
權限 | 簡寫 | 解釋 | 適用於簽章權限等級 |
---|---|---|---|
Read | r | 讀取 container 資料或 blob 內容 | Blob, Container |
Write | w | 寫入 blob 至 container 內的資料夾或寫入至 blob | Blob, Container |
Delete | d | 刪除 container 內的 blob 檔案 | Blob, Container |
List | l | 列出 container 中資料夾內容 | Container |
Add | a | 對 blob 結尾附加內容 | Blob, Container |
Create | c | 建立新的 blob (但是不能夠對已經存在的 blob修改) | Blob, Container |
透過 portal 後台取得共用存取簽章 – storage account 等級權限
要取得 container 等級的共用存取簽章(SAS)可以在進入 storage 管理頁面後點左邊的 [共用存取簽章],設定要該簽章能夠使用的權限範圍以及簽章有效時間
點擊 [產生 SAS 與連結字串] 可以取得存取簽章
其權限依據設定最大可以對所有 container 中所有 blob 資料進行存取以及刪除
透過 portal 後台取得共用存取簽章 – blob 檔案等級權限
如果只想讓使用者存取單一檔案 (blob),則可以進入點左方的容器 (container)
然後點想要的容器
接著對點擊想要簽署的檔案
點擊 [產生 SAS]
接著設定要簽署的權限後點 [產生SAS權杖與URL]
Blob SAS 權杖便是共用存取簽章
透過程式產生 SAS
而如果是要做成程式服務的話,可能會依臨時需求產生一個期限較短的簽章,下面教學如何透過程式產生簽章 (這邊使用官方 SDK 內的函數產生,如果想要自己撰寫產生的程式碼可以參考官方產生的演算法:Create a user delegation SAS)
PHP 版本:
安裝套件:
composer require microsoft/azure-storage-blob
產生 sas token 的 code (container 等級)
use MicrosoftAzure\Storage\Blob\BlobSharedAccessSignatureHelper; use MicrosoftAzure\Storage\Blob\Internal\BlobResources as Resources; $account_name = 'your_account_name'; $account_key = 'your_account_key'; // 存取金鑰 (機碼) $blob_shared_access_signature_helper = new BlobSharedAccessSignatureHelper($account_name, $account_key); $signed_resource = Resources::RESOURCE_TYPE_CONTAINER; $container_name = 'your-container-name'; $signed_permissions = 'rwdlac'; // 簽章的權限 (參考縮寫) $signed_expiry = new Datetime('+3600 second'); // 簽章過期時間 $sas_token = $blob_shared_access_signature_helper->generateBlobServiceSharedAccessSignatureToken( $signed_resource, $container_name, $signed_permissions, $signed_expiry );
產生 sas token 的 code (blob 等級)
use MicrosoftAzure\Storage\Blob\BlobSharedAccessSignatureHelper; use MicrosoftAzure\Storage\Blob\Internal\BlobResources as Resources; $account_name = 'your_account_name'; $account_key = 'your_account_key'; // 存取金鑰 (機碼) $blob_shared_access_signature_helper = new BlobSharedAccessSignatureHelper($account_name, $account_key); $signed_resource = Resources::RESOURCE_TYPE_BLOB; $container_name = 'container-01'; $blob_name = 'your/blob/file/path'; $signed_permissions = 'rwdac'; // 簽章的權限 (參考縮寫) $signed_expiry = new Datetime('+3600 second'); // 簽章過期時間 $sas_token = $blob_shared_access_signature_helper->generateBlobServiceSharedAccessSignatureToken( $signed_resource, $container_name . '/' . $blob_name, $signed_permissions, $signed_expiry );
Node JS 版本
安裝套件:
npm install --save @azure/storage-blob
產生 sas token 的 code (container 等級)
const AzureStorageBlob = require("@azure/storage-blob"); const StorageSharedKeyCredential = AzureStorageBlob.StorageSharedKeyCredential; const ContainerSASPermissions = AzureStorageBlob.ContainerSASPermissions; let account = 'your_account_name'; let accountKey = 'your_account_key'; // 存取金鑰 (機碼) let sharedKeyCredential = new StorageSharedKeyCredential(account, accountKey); let containerName = 'your-container-name'; let permisions = 'racwdl'; // 簽章的權限 (參考縮寫) let sasToken = AzureStorageBlob.generateBlobSASQueryParameters({ containerName, permissions: ContainerSASPermissions.parse(permisions), expiresOn: new Date(new Date().valueOf() + 3600 * 1000), // 簽章過期時間 }, sharedKeyCredential ).toString();
產生 sas token 的 code (blob 等級)
const AzureStorageBlob = require("@azure/storage-blob"); const StorageSharedKeyCredential = AzureStorageBlob.StorageSharedKeyCredential; const ContainerSASPermissions = AzureStorageBlob.ContainerSASPermissions; let account = 'your_account_name'; let accountKey = 'your_account_key'; // 存取金鑰 (機碼) let sharedKeyCredential = new StorageSharedKeyCredential(account, accountKey); let blobName = 'your/blob/file/path'; let containerName = 'your-container-name'; let permisions = 'racwd'; // 簽章的權限 (參考縮寫) let sasToken = AzureStorageBlob.generateBlobSASQueryParameters({ containerName, blobName, permissions: ContainerSASPermissions.parse(permisions), expiresOn: new Date(new Date().valueOf() + 3600 * 1000) }, sharedKeyCredential ).toString();