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

标签 node.js azure-storage azure-mobile-services azure-blob-storage

我正在尝试从我的 azure-mobile-services 中的自定义 api 获取 azure blob-storage 中 blob 的 SAS 访问 URL。为此,我使用 azure-storage Node 模块,使用这个 how-to指导。我在移动服务配置中设置了所需的 AZURE_STORAGE_ACCOUNT 和 AZURE_STORAGE_ACCESS_KEY 环境变量。下面是我为此的代码片段。从日志中我可以看到“blobService.generateSharedAccessSignature”成功返回 sasQueryUrl 对象,记录器代码行

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

返回 -

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 本身会序列化查询字符串并将其作为字符串而不是对象返回。因此,库在返回查询字符串对象之前已经调用了 qs.stringify。这使得用户在想要使用 SAS token 执行操作时可以轻松使用它,因为 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 token 用作对象,请使用 qs.parse 创建查询字符串对象。

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

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

关于node.js - 使用 'azure-storage' npm 为 Blob 存储生成 SAS 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28659877/

相关文章:

javascript - Webpack html 插件不生成 html

c# - Azure存储blob下载旧文件版本

c# - 如何在Azure移动服务中添加信号器管道模块

javascript - $InstallationId 标记的通知中心推送问题

Azure 日志显示 : "The supplied notification payload is invalid" for official Xamarin. Android 示例

javascript - Redis MULTI 事务在 NodeJS 中的 EXEC 回调中随机返回 null

javascript - before() 不在后续的destroy() 之前执行?

azure - 是否可以在 headers/cookies/post body 中传递 Azure SAS token ?

node.js - npm 错误!写在结束之后。 RUN npm install 在 docker、aws 中失败

azure - ASP.Net Core 2.2 - Azure SAS token ?