分享方式:


使用 Azure Blob 儲存體 和 JavaScript 建立和使用帳戶 SAS 權杖

本文示範如何建立並使用帳戶 SAS 權杖,藉此使用適用於 JavaScript 的 Azure Blob 儲存體用戶端程式庫 v12。 連線之後,您的程式碼就可以在 Blob 儲存體服務的容器、Blob 和功能上運作。

範例程式碼片段可在 GitHub 中以可執行的 Node.js 檔案形式來取得。

套件 (npm) | 範例 | API 參考 | 程式庫原始程式碼 | 提供意見反應

帳戶 SAS 權杖

帳戶 SAS 權杖一種 SAS 權杖,可供 Azure 儲存體提供的存取委派。 帳戶 SAS 權杖可讓您存取 Azure 儲存體。 權杖的限制必須在建立權杖時進行定義。 由於具有權杖的任何人都可以用其來存取您的儲存體帳戶,因此您應該使用最嚴格的權限來定義權杖 (該權限仍允許權杖完成所需的工作)。

權杖建立的最佳做法包括限制下列權限:

  • 服務:Blob、檔案、佇列、資料表
  • 資源類型:服務、容器或物件
  • 建立、讀取、寫入、更新和刪除等權限

將必要的相依性新增至您的應用程式

包含建立帳戶 SAS 權杖所需的相依性。

const { 
    BlobServiceClient, 
    generateAccountSASQueryParameters, 
    AccountSASPermissions, 
    AccountSASServices,
    AccountSASResourceTypes,
    StorageSharedKeyCredential,
    SASProtocol 
} = require('@azure/storage-blob');
require('dotenv').config()

取得環境變數以建立共用金鑰認證

使用 Blob 儲存體帳戶名稱和金鑰來建立 StorageSharedKeyCredential。 建立和使用 SAS 權杖時需要此金鑰。

使用儲存體帳戶名稱和帳戶金鑰來建立 StorageSharedKeyCredential。 然後使用 StorageSharedKeyCredential 來初始化 BlobServiceClient

const constants = {
    accountName: process.env.AZURE_STORAGE_ACCOUNT_NAME,
    accountKey: process.env.AZURE_STORAGE_ACCOUNT_KEY
};
const sharedKeyCredential = new StorageSharedKeyCredential(
    constants.accountName,
    constants.accountKey
);

非同步作業樣板

其餘的範例程式碼片段會假設下列非同步樣板程式碼適用於 Node.js。

async function main() {

    const sasToken = await createAccountSas();

    await useSasToken(sasToken);
}

main()
    .then(() => {
        console.log(`done`);
    }).catch((ex) => {
        console.log(`Error: ${ex.message}`)
    });

建立 SAS 權杖

由於此權杖可以搭配 Blob、佇列、資料表和檔案使用,因此某些設定會比 Blob 選項更廣泛。

  1. 建立選項物件。

    SAS 權杖的可用範圍是由 AccountSASSignatureValues 所定義。

    使用 SDK 所提供的下列協助程式函式,為值建立正確的實值型別:

  2. 將物件傳遞至 generateAccountSASQueryParameters 函式以及 SharedKeyCredential,以建立 SAS 權杖。

    在傳回 SAS 權杖之前,請在前面加上查詢字串分隔符號:?

    async function createAccountSas() {
    
        const sasOptions = {
    
            services: AccountSASServices.parse("btqf").toString(),          // blobs, tables, queues, files
            resourceTypes: AccountSASResourceTypes.parse("sco").toString(), // service, container, object
            permissions: AccountSASPermissions.parse("rwdlacupi"),          // permissions
            protocol: SASProtocol.Https,
            startsOn: new Date(),
            expiresOn: new Date(new Date().valueOf() + (10 * 60 * 1000)),   // 10 minutes
        };
    
        const sasToken = generateAccountSASQueryParameters(
            sasOptions,
            sharedKeyCredential 
        ).toString();
    
        console.log(`sasToken = '${sasToken}'\n`);
    
        // prepend sasToken with `?`
        return (sasToken[0] === '?') ? sasToken : `?${sasToken}`;
    }
    
  3. 妥善保存 SAS 權杖,直到使用為止。

搭配帳戶 SAS 權杖使用 Blob 服務

若要使用帳戶 SAS 權杖,您必須將其與帳戶名稱結合以建立 URI。 傳遞 URI 以建立 blobServiceClient。 擁有 blobServiceClient 之後,您就可以使用該用戶端來存取 Blob 服務。

// connect-with-sas-token.js
const { BlobServiceClient } = require('@azure/storage-blob');
require('dotenv').config()

const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
const sasToken = process.env.AZURE_STORAGE_SAS_TOKEN;
if (!accountName) throw Error('Azure Storage accountName not found');
if (!sasToken) throw Error('Azure Storage accountKey not found');

const blobServiceUri = `https://${accountName}.blob.core.windows.net`;

// https://YOUR-RESOURCE-NAME.blob.core.windows.net?YOUR-SAS-TOKEN
const blobServiceClient = new BlobServiceClient(
  `${blobServiceUri}?${sasToken}`,
  null
);

async function main(){
  
  const containerName = 'REPLACE-WITH-EXISTING-CONTAINER-NAME';
  const blobName = 'REPLACE-WITH-EXISTING-BLOB-NAME';

  const timestamp = Date.now();
  const fileName = `my-new-file-${timestamp}.txt`;

  // create container client
  const containerClient = await blobServiceClient.getContainerClient(containerName);

  // create blob client
  const blobClient = await containerClient.getBlockBlobClient(blobName);

  // download file
  await blobClient.downloadToFile(fileName);

  console.log(`${fileName} downloaded`);
  
}

main()
  .then(() => console.log(`done`))
  .catch((ex) => console.log(`error: ${ex.message}`));

dotenv 套件可用來從 .env 檔案讀取您的儲存體帳戶名稱。 此檔案不應簽入原始檔控制。

另請參閱