通过 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 选项的范围更广泛。
创建 options 对象。
SAS 令牌的功能范围由 AccountSASSignatureValues 定义。
使用 SDK 提供的以下帮助程序函数为值创建正确的值类型:
- AccountSASServices.parse("btqf").toString():
- b:Blob
- t:表
- q:查询
- f:文件
- resourceTypes: AccountSASResourceTypes.parse("sco").toString()
- s:服务
- c:容器 - 例如 Blob 容器、表或队列
- o:对象 - Blob、行、消息
- permissions: AccountSASPermissions.parse("rwdlacupi")
- r:读取
- w:写入
- d:删除
- l:列出
- f:筛选器
- a:添加
- c:创建
- u:更新
- t:标记访问
- p:进程 - 例如队列中的进程消息
- i:设置不可变性策略
- AccountSASServices.parse("btqf").toString():
将对象与 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}`;
}
- 使用 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
文件中读取存储帐户名称。 不应将此文件签入到源代码管理中。