node.js - 使用 Azure SDK for Node.js 中的 BlobService.getBlobURL() 生成 Azure 共享访问签名

标签 node.js azure azure-blob-storage

我尝试使用本地计算机上 Node.js 上的 Azure 库中的 BlobService.getBlobURL() 生成具有共享访问签名的 Blob 的 URL。但是,当我尝试通过生成的 URL 检索 blob 时,我收到一条身份验证错误,指出“签名不匹配”。从 Azure 管理门户下载相同的 blob 效果很好。

下面是我用来生成 URL 的代码:

process.env['AZURE_STORAGE_ACCOUNT'] = "[MY_ACCOUNT_NAME]";
process.env['AZURE_STORAGE_ACCESS_KEY'] = "[MY_ACCESS_KEY]";

var azure = require('azure');
var blobs = azure.createBlobService();

blobs.getBlobUrl('[CONTAINER_NAME]', "[BLOB_NAME]",  { AccessPolicy: {
    Start: Date.now(),
    Expiry: azure.date.minutesFromNow(60),
    Permissions: azure.Constants.BlobConstants.SharedAccessPermissions.READ
}});

该函数生成的URL是:

https://[MY_ACCOUNT_NAME].blob.core.windows.net:443/[CONTAINER_NAME]/
    [ENCODED_BLOB_NAME]
    ?st=2013-10-28T18%3A34%3A23Z
    &se=2013-10-28T19%3A34%3A23Z
    &sp=r
    &sr=b
    &sv=2012-02-12
    &sig=rLB%2FEOAWzijkkWcseju8TJLAxzeE5e3Pvq1i68i5Erc%3D

当我尝试将此 URL 粘贴到浏览器中时,收到以下错误消息:

<Error>
    <Code>AuthenticationFailed</Code>
    <Message>
        Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:9fe3d3ed-97f4-43d1-8c65-c95ce6b15a08 Time:2013-10-28T18:34:43.3015398Z
    </Message>
    <AuthenticationErrorDetail>
    Signature did not match. String to sign used was r 2013-10-28T18:34:23Z 2013-10-28T19:34:23Z /[MY_ACCOUNT_NAME]/[CONTAINER_NAME]/[BLOB_NAME] 2012-02-12
    </AuthenticationErrorDetail>
</Error>

然后我尝试登录 Azure 管理门户,选择相同的 blob,然后下载它。这有效。管理门户提供的 URL 为:

http://[MY_ACCOUNT_NAME].blob.core.windows.net/[CONTAINER_NAME]/
    [ENCODED_BLOB_NAME]
    ?sv=2012-02-12
    &st=2013-10-28T18%3A35%3A16Z
    &se=2013-10-28T18%3A42%3A16Z
    &sr=b
    &sp=r
    &sig=kcjV%2BkrNAaWOj%2F7NFwmHefXJEiEyu61U7mUTsw3pw7w%3D

最佳答案

从 Azure Node.js 库版本 0.7.16 开始,似乎存在导致此行为的错误。当 Blob 名称包含空格时,BlobService.getBlobURL() 无法生成正确的签名。要解决此问题,请上传名称中不包含任何空格的新 Blob,然后使用新 Blob 的名称再次调用 BlobService.getBlobURL()。这次生成的URL将是有效的。您可以查看此issue on Github .

关于node.js - 使用 Azure SDK for Node.js 中的 BlobService.getBlobURL() 生成 Azure 共享访问签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19643141/

相关文章:

azure - PowerShell Azure Blob 存储排除特定内容类型

azure - 我可以使用自定义策略将两个电子邮件地址用于 MFA 吗?

javascript - 通过前端上传到azure blob存储

javascript - Node 中的 Array.pop 跳过并忘记了一个函数项

node.js - SailsJS 错误 : Cannot find module 'sails/node_modules/waterline/lib/waterline/query/deferred'

Azure 订阅迁移到新租户 : save RBAC

AzureResourceManagerTemplateDeployment 在 Azure DevOps 管道中失败

asp.net - WindowsAzure.Storage 生产中出现 403 错误

javascript - 拦截 WebSocket 消息

node.js - 使用 Node.js 从 'named pipe'/fifo 读取