如何在 nodejs sdk v12 中生成带有 SAS 签名的 azure blob url?

Has*_*eyf 4 azure azure-storage azure-storage-blobs node.js

以前(在像 v2 这样的旧版 sdk 中)您可以生成一个 sas url(一个 blob 的签名可共享 url),如下所示:

var azure = require('azure-storage');
var blobService = azure.createBlobService();

var startDate = new Date();
var expiryDate = new Date(startDate);
expiryDate.setMinutes(startDate.getMinutes() + 100);
startDate.setMinutes(startDate.getMinutes() - 100);

var sharedAccessPolicy = {
  AccessPolicy: {
    Permissions: azure.BlobUtilities.SharedAccessPermissions.READ,
    Start: startDate,
    Expiry: expiryDate
  }
};

var token = blobService.generateSharedAccessSignature(containerName, blobName, sharedAccessPolicy);
var sasUrl = blobService.getUrl(containerName, blobName, token);
Run Code Online (Sandbox Code Playgroud)

我想知道如何在 sdk v12 中生成该 url?我在 v12 中找不到任何有关 Sas URL 的文档。

BlobUtilities 和 getUrl() 方法在 v12 中也不可用(在 v12 中,每个模块都有单独的包,在我的情况下,我使用的是 require("@azure/storage-blob");)

谢谢。

Jim*_* Xu 9

关于该问题,请参考以下代码

var storage = require("@azure/storage-blob")
  const accountname ="blobstorage0516";
    const key = "";
    const cerds = new storage.StorageSharedKeyCredential(accountname,key);
    const blobServiceClient = new storage.BlobServiceClient(`https://${accountname}.blob.core.windows.net`,cerds);
    const containerName="test";
    const client =blobServiceClient.getContainerClient(containerName)
    const blobName="help.txt";
    const blobClient = client.getBlobClient(blobName);

    const blobSAS = storage.generateBlobSASQueryParameters({
      containerName, 
      blobName, 
      permissions: storage.BlobSASPermissions.parse("racwd"), 
      startsOn: new Date(),
      expiresOn: new Date(new Date().valueOf() + 86400)
    },
    cerds 
  ).toString();

    const sasUrl= blobClient.url+"?"+blobSAS;
    console.log(sasUrl);
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 这是我对此找到的最佳答案。我尝试从头开始编写 can 并不断收到签名不匹配的信息。我复制并粘贴了此代码,更改了详细信息,并且 SAS url 有效。我花了6个小时才解决这个问题。太感谢了。 (3认同)

Gau*_*tri 5

您可以通过使用来做到这一点generateBlobSASQueryParameters。例如,请参阅下面的代码:

const AZURE_STORAGE_ACCOUNT = 'account-name';
const AZURE_STORAGE_ACCESS_KEY = 'account-key';
const { StorageSharedKeyCredential, BlobServiceClient, generateBlobSASQueryParameters, BlobSASPermissions } = require("@azure/storage-blob");
const sharedKeyCredential = new StorageSharedKeyCredential(AZURE_STORAGE_ACCOUNT, AZURE_STORAGE_ACCESS_KEY);


const blobServiceClient = new BlobServiceClient(
  `https://${AZURE_STORAGE_ACCOUNT}.blob.core.windows.net`,
  sharedKeyCredential
);

const containerName = 'container-name';
const blobName = 'blob-name';
const containerClient = blobServiceClient.getContainerClient(containerName);
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
// const credentials = new StorageSharedKeyCredential()
const sasToken = generateBlobSASQueryParameters({
  containerName: containerName,
  blobName: blobName,
  expiresOn: new Date(new Date().valueOf() + 86400),
  permissions: BlobSASPermissions.parse("racwd")
}, sharedKeyCredential);

const sasUrl = `${blockBlobClient.url}?${sasToken}`;

console.log(sasUrl);
Run Code Online (Sandbox Code Playgroud)