使用 'azure-storage' npm 为 Blob 存储生成 SAS 不起作用

Generating SAS for Blob Storage using 'azure-storage' npm not working

我正在尝试从我的 azure-mobile-services 中的自定义 api 获取 Azure blob 存储中 blob 的 SAS 访问权限 URL。为此,我正在使用 azure-storage node module, using this how-to 指南。我在移动服务配置中设置了所需的 AZURE_STORAGE_ACCOUNT 和 AZURE_STORAGE_ACCESS_KEY 环境变量。下面是我为此编写的代码片段。从日志中我可以看到 'blobService.generateSharedAccessSignature' 成功 returns sasQueryUrl 对象,记录器代码行

 logger.info('sasQueryUrl=', sasQueryUrl);

returns -

sasQueryUrl="st=2015-02-22T03%3A28%3A25Z&se=2015-02-22T03%3A48%3A25Z&sp=w&sv=2014-02-14&sr=b&sig=MUG7LT4Fe%2BGLu5lAa%2FgIXQM33AKtBDNrnEOV9H9FzBE%3D" st=2015-02-22T03%3A28%3B45Q&se=2015-02-22T03%3A48%3A25Z&sp=w&sv=2014-02-14&sr=b&sig=MEU7DE4Fe%2BGLu5lAa%2FgIAQTM33AKtBDNrnEOV9H9FzBE%3D [object Object])

但是下面的记录器代码行

logger.info('sasQueryUrl.queryString = ' + qs.stringify(sasQueryUrl.queryString));

日志 -

sasQueryUrl.queryString = [object Object],

所以 qs 没有字符串化 sasQueryUrl.queryString。因此,我无法为 blob 构建 SAS URL。

下面是我的函数代码-

function getImageBlobSASURL(item, callback){
    var iM = 'api.images.getImageBlobSASURL -";
    try {
        var azureStrg = require('azure-storage');
        var qs = require('querystring');
        var retryOperationFilter = new azureStrg.ExponentialRetryPolicyFilter();
        var blobService = azureStrg.createBlobService().withFilter(retryOperationFilter);

        var containerName = item.image.container.toLowerCase();
        blobService.createContainerIfNotExists(containerName, function(err, containerCreatedResultFlag, response) {
            if (err) {
                throw new Error(iM + "couldn't create container-" + containerName + ".Error=" + err);
            }

            //Create SAS for the BLOB with write access to the container for the next 10 mins.
            var startDate = new Date();
            var expiryDate = new Date(startDate);
            expiryDate.setMinutes(startDate.getMinutes() + 10);
            startDate.setMinutes(startDate.getMinutes() - 10);

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

            var sasQueryUrl = blobService.generateSharedAccessSignature(containerName, '' , sharedAccessPolicy);

            logger.info(iM + 'sasQueryUrl=', sasQueryUrl);

            logger.info(iM + 'sasQueryUrl.queryString =' + qs.stringify(sasQueryUrl.queryString));
            item.image.sas.qstr = qs.stringify(sasQueryUrl.queryString); //Set the query string.

            //Set the full path on the new new item, which is used for data binding on the client.
            item.image.url = sasQueryUrl.baseUrl + sasQueryUrl.path + '/' + item.image.resourceName;

            logger.info(iM + 'Received sas URI for the resource=', item.image);
            callback.success(containerCreatedResultFlag, item);
        }
    }
    catch(err){
        logger.error( iM + 'error - ' + err);
        callback.error(err);
        return false;
    }

}

有人知道这里出了什么问题吗?非常感谢任何指点

blobService.generateSharedAccessSignature 本身将查询字符串序列化,returns 将其序列化为字符串而不是对象。所以库在返回之前已经在查询字符串对象上调用了 qs.stringify 。这使得用户在想要使用 SAS 令牌执行操作时可以轻松使用它,因为 blob 服务创建 API 直接采用查询字符串的字符串形式,如下所示 -

var sharedAccessSignatureToken = blobService.generateSharedAccessSignature(container, blob, sharedAccessPolicy);

var sharedBlobService = azure.createBlobServiceWithSas(blobService.host, sharedAccessSignatureToken);

// Download the blob properties by using the shared access signature URL. 
sharedBlobService.getBlobProperties(container, blob, function (error) {
if (error) {
  console.log(error);
} 
}

如果您想使用 SAS 令牌作为对象,请使用 qs.parse 创建查询字符串对象。

如果您更愿意使用使用 SAS 令牌生成的 Uri,请按如下方式构建 Uri -

uri = blobService.host.primaryHost + '/' + container + '?' + sharedAccessSignatureToken