通过 Azure Blob 存储和 JavaScript 创建并使用帐户 SAS 令牌

本文介绍如何创建和使用帐户 SAS 令牌以使用适用于 JavaScript 的 Azure Blob 存储客户端库 v12。 连接后,可以针对 Blob 存储服务的容器、Blob 和功能运行代码。

示例代码片段在 GitHub 中作为可运行 Node.js 文件提供。

包 (npm) | 示例 | API 参考 | 库源代码 |

帐户 SAS 令牌

帐户 SAS 令牌是一种由 Azure 存储提供的用于访问委派的 SAS 令牌。 帐户 SAS 令牌提供对 Azure 存储的访问。 令牌的限制性取决于在创建它时对它的定义。 因为任何拥有该令牌的人都可以使用它来访问你的存储帐户,所以应使用最严格的权限定义令牌,但仍允许该令牌完成所需任务。

创建令牌的最佳做法包括限制权限:

  • 服务:Blob、文件、队列、表
  • 资源类型:服务、容器或对象
  • 创建、读取、写入、更新和删除等权限

将所需依赖项添加到你的应用程序

包括创建帐户 SAS 令牌所需的依赖项。

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

获取环境变量以创建共享密钥凭据

使用 Blob 存储帐户名称和密钥创建 StorageSharedKeyCredential。 创建 SAS 令牌和使用 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. 创建 options 对象。

    SAS 令牌的功能范围由 AccountSASSignatureValues 定义。

    使用 SDK 提供的以下帮助程序函数为值创建正确的值类型:

  2. 将对象与 SharedKeyCredential 一起传递给 generateAccountSASQueryParameters 函数,以创建 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}`;
}
  1. 使用 SAS 令牌之前保护它。

将 Blob 服务与帐户 SAS 令牌结合使用

若要使用帐户 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.chinacloudapi.cn`;

// https://YOUR-RESOURCE-NAME.blob.core.chinacloudapi.cn?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 文件中读取存储帐户名称。 不应将此文件签入到源代码管理中。

另请参阅